4

我想使用 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>名称属性?

4

2 回答 2

5

假设您获得“请求”节点,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();
于 2012-01-13T16:24:40.237 回答
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文件放在与Main.java相同目录下名为lib的目录中:

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 内部的内容。

于 2014-07-25T15:56:41.287 回答