Xml解析包括内联解析

时间:2012-01-08 20:00:16

标签: java xml

使用:

 import org.w3c.dom.*;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.DocumentBuilder;

如何提取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>

我如何简单地提取数据? 另外我如何从内联行中提取数据?

<request method="POST" url="/devices/test/planner" body="*">

感谢?

2 个答案:

答案 0 :(得分:2)

我推荐使用XPath。你可以手动遍历DOM,但为什么呢? XPath旨在解决这个问题。这是一个完整的Java / JAXP / XPath示例( sans 错误检查和异常处理):

import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class Xpather {
    public static void main(String[] args) 
            throws XPathExpressionException, ParserConfigurationException, 
            SAXException, IOException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource("workbook.xml"));
        XPath xpath = XPathFactory.newInstance().newXPath();
        Node body = (Node) xpath.evaluate("/request/response/body", doc,
                XPathConstants.NODE);
        System.out.println(body.getTextContent());
        Node url = (Node) xpath.evaluate("/request/@url", doc,
                XPathConstants.NODE);
        System.out.println(url.getNodeValue());
    }
}

此代码在body元素上打印url元素的内容和request属性的值。

输出:

  

预订已创建!

     

/设备/测试/计划

答案 1 :(得分:1)

使用XPath - 也可通过standard Java APIs随时使用。获得Document后,Java的XPath可以直接评估它 - 所以仍然可以使用DocumentBuilder等。

例如,您可以使用<request/>获取/request元素,或使用/request/@url等内容获取请求的网址。

另一种选择 - 特别是对于您可能在同一模式下处理许多文档的高性能使用场景 - 是使用SAX解析,您将在其中接收处理的每个XML元素的事件,并给出其名称和列表属性。