从给定节点提取子节点数据

时间:2012-01-13 16:13:19

标签: java xml-parsing dom4j

我想使用DOM4j在Java中解析xml文件。

我以此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 个答案:

答案 0 :(得分:5)

假设您将“请求”节点作为Element获取,那么您可以执行以下操作:

Element response = (Element) request.elements().get(0);
int statusCode = Integer.parseInt(response.attribute("statusCode"));

如果要以递归方式遍历子节点,则必须编写迭代(或递归)代码来访问elements()方法返回的列表中的每个元素。

[编辑] 您还可以use XPath to extract the specific items寻找:

int statusCode = Integer.parseInt(
    request.selectSingleNode("response/@statusCode").getText());
String firstHeaderName =
    request.selectSingleNode(
        "response/headerParameters/headerParameter/@name").getText();

答案 1 :(得分:2)

使用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将其解析为Document类型。它使用selectNodes(string)方法来获取PieHole xml标记。对于每个PieHole xml标签,它将获取蛋糕和蒙大拿标签并将它们放入Foo类。最后,它打印出Foo中的内容。