Извлечение данных дочерних узлов из данного узла
Я хочу использовать DOM4j для разбора XML-файла в Java.
У меня есть этот XML в качестве примера:
<request method="POST" url="/devices/test/planner" body="*">
<response statusCode="200">
<header>
<headerParameters>
<headerParameter name="Content-Type">
Content-Type=application/xml
</headerParameter>
</headerParameters>
</header>
<body>booking created!</body>
</response>
</request>
Учитывая узел запроса (первый узел), как я могу извлечь данные дочерних узлов?
Например, получить <response>
код состояния или <headerParameter>
атрибуты имени?
2 ответа
Предполагая, что вы получите "запрос" узел как Element
тогда вы можете сделать что-то вроде этого:
Element response = (Element) request.elements().get(0);
int statusCode = Integer.parseInt(response.attribute("statusCode"));
Если вы хотите рекурсивно пройти по дочерним элементам, вам придется написать итерационный (или рекурсивный) код, чтобы посетить каждый элемент в списке, возвращаемом elements()
метод.
[Редактировать] Вы также можете использовать XPath для извлечения определенных элементов, которые вы ищете:
int statusCode = Integer.parseInt(
request.selectSingleNode("response/@statusCode").getText());
String firstHeaderName =
request.selectSingleNode(
"response/headerParameters/headerParameter/@name").getText();
Извлечение данных дочерних узлов из данного узла с помощью dom4j:
1. Поместите этот код Java в файл с именем Main.java:
import java.util.*;
import java.io.*;
import org.dom4j.*;
import org.dom4j.io.*;
class Foo{
String moo;
String baz;
}
class Main{
public static Document parse(String filePath) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(filePath);
return document;
}
public static void main(String[] args){
try{
File f = new File("/tmp/myxml.xml");
Document document = parse(f.toString());
List list = document.selectNodes("//penguins/PieHole");
Foo foo = new Foo();
Iterator iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
foo.moo = element.selectSingleNode("cupcake").getText();
foo.baz = element.selectSingleNode("montana").getText();
}
System.out.println("foo.moo: " + foo.moo);
System.out.println("foo.baz: " + foo.baz);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("done");
}
}
2. Поместите это в файл с именем /tmp/myxml.xml:
<?xml version="1.0" encoding="utf-8"?>
<penguins>
<mars>129</mars>
<PieHole>
<cupcake>value inside cupcake</cupcake>
<montana>value inside montana</montana>
</PieHole>
</penguins>
2. Поместите эти файлы JAR в каталог с именем lib в том же каталоге, что и Main.java:
dom4j-1.6.1.jar
jaxen-1.1.1.jar
3. Скомпилируйте программу и запустите ее из терминала:
javac -cp .:./lib/* Main.java
java -cp .:./lib/* Main
4. Интерпретировать вывод:
eric@defiant ~/code/java/run04 $ javac -cp .:./lib/* Main.java
eric@defiant ~/code/java/run04 $ java -cp .:./lib/* Main
foo.moo: value inside cupcake
foo.baz: value inside montana
done
5. Что только что произошло?
При этом используется Java версии 1.7.0 и импортируется библиотека dom4j версии 1.6.1, а также библиотека поддержки jaxen 1.1.1. Он импортирует документ XML, созданный пользователем. Затем он анализирует его с помощью SAXReader в тип документа. Он использует метод selectNodes(string) для захвата тега PieHole xml. Для каждого отдельного тега PieHole xml он будет захватывать теги cupcake и montana и помещать их в класс Foo. В конце он печатает то, что было внутри Foo.