Java не получается прочитать xml
У меня есть файл xml. Он имеет такую структуру:
<?xml version='1.0' encoding='utf-8'?>
<tasks>
<task file_id="3406" cont_name="D:\Data\cont\con1.dat" cont_offset="596672" file_size="16209"/>
<task file_id="3608" cont_name="D:\Data\cont\con2.dat" cont_offset="39199605" file_size="101394"/>
<task file_id="13435" cont_name="D:\Data\cont\con3.dat" cont_offset="28936" file_size="14900"/>
</tasks>
Моя задача, прочитать этот файл и достать значения атрибутов:
file_id
cont_name
cont_offset
file_size
Для чтения использую такой код:
File task_xml = new File("D:"+File.separator+
"Data"+File.separator+
"task"+File.separator+
"task2.xml");
if(task_xml.exists()){
System.out.println("File exist");
}
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// Создается дерево DOM документа из файла
Document document = documentBuilder.parse(task_xml);
// Получаем корневой элемент
Node root = document.getDocumentElement();
System.out.println(root.getNodeName());
System.out.println(root.getNodeValue());
//Сохраняем все подэлементы корневого - т.е. task
NodeList tasks = root.getChildNodes();
//task равен null
//Проходим по всем подэлементам root
for (int i = 0; i < tasks.getLength(); i++) {
Node task = tasks.item(i);
System.out.println(task.getNodeName()); //Текущая строчка <task....>
//Сохранить все атрибуты этой строчки
NamedNodeMap taskMap = task.getAttributes();
//Пройтись по всем этим атрибутам
for (int k = 0; k < taskMap.getLength(); k++) {
Node curAtribute = taskMap.item(i);
System.out.println(curAtribute.getNodeName());
System.out.println(curAtribute.getNodeValue());
}
//Перейти а след.строчку <task ...>
} //Конец прохода по всем строчкам
Я могу прочитать главный элемент - root равный tasks, при этом если я хочу получить его Child, то на строчек:
//Сохраняем все подэлементы корневого - т.е. task
NodeList tasks = root.getChildNodes();
tasks равен null, как бы дочерних элементов нет. Но строчки же есть:
<task file_id="3406" cont_name="D:\Data\cont\con1.dat" cont_offset="596672" file_size="16209"/>
<task file_id="3608" cont_name="D:\Data\cont\con2.dat" cont_offset="39199605" file_size="101394"/>
<task file_id="13435" cont_name="D:\Data\cont\con3.dat" cont_offset="28936" file_size="14900"/>
Подскажите как мне обратиться к этим вложенным строчка, и достать значения их атрибутов? Поискал методы как в ним обратиться и не нашел подходящего варианта. Или может и вовсе нужен другой способ сначала, подскажите пожалуйста как быть, заранее спасибо большое.
Ответы (2 шт):
Для того, чтобы решить подобную задачу можно использовать библиотеку JDOM.
Для начала добавим зависимости в наш файл pom.xml:
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>2.0.2</version>
</dependency>
Затем будем использовать следующий код:
SAXBuilder parser = new SAXBuilder();
org.jdom2.Document xmlDoc = parser.build(task_xml);
//Получить вссе подэлементы <task>
List children = xmlDoc.getRootElement().getChildren();
Iterator i = children.iterator();
while(i.hasNext()){ //Проход по всем подэлементам <task>
Element nowTask = (Element) i.next(); //Текущий child элемента <task>
//Параметры строчки
String file_id = nowTask.getAttributeValue ("file_id");
String cont_name = nowTask.getAttributeValue ("cont_name");
String cont_offset = nowTask.getAttributeValue("cont_offset");
String file_size = nowTask.getAttributeValue ("file_size");
System.out.println("task: "+file_id+" "
+cont_name+" "
+cont_offset+" "
+file_size+" ");
} //Переход на другую строчку
Тем самым получить обратиться к элементы и достать его 3 вложенные строчки и дальше взаимодействовать с ними так как нужно. В моем примере, я обращаюсь к атрибутам этой строки.
Смотрите комментарии в примере исходного кода:)
//Сохраняем все ноды корневого - т.е. task и прочее неизвестное
NodeList tasks = root.getChildNodes();
//tasks не равен null
//Проходим по всем нодам root
for (int i = 0; i < tasks.getLength(); i++) {
Node task = tasks.item(i);
// Дочерние ноды - это не только лишь подэлементы,
// но и прочий мусор, невидимый невооруженным взглядом
if (task.getNodeType() != Element.ELEMENT_NODE) {
continue;
}
System.out.println(task.getNodeName()); //Текущая строчка <task....>
//Сохранить все атрибуты этой строчки
NamedNodeMap taskMap = task.getAttributes();
//Пройтись по всем этим атрибутам
for (int k = 0; k < taskMap.getLength(); k++) {
Node curAtribute = taskMap.item(k); // <- здесь k должно быть
System.out.println(curAtribute.getNodeName());
System.out.println(curAtribute.getNodeValue());
}
//Перейти а след.строчку <task ...>
} //Конец прохода по всем строчкам