Извлечение данных дочерних узлов из данного узла - PullRequest
4 голосов
/ 13 января 2012

Я хочу использовать 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 ]

5 голосов
/ 13 января 2012

Предполагая, что вы получите узел "request" как 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();
2 голосов
/ 25 июля 2014

Извлечение данных дочерних узлов из данного узла с помощью 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.

...