XML解析包括在线分析
问题描述:
使用: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="*">
谢谢?
答
我第二次推荐使用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
元素和request
元素的url
属性值的内容。
输出:
预订创建!
/设备/测试/规划
答
使用XPath - 也容易通过standard Java APIs获得。一旦你有了Document
,Java的XPath就可以直接评估它 - 所以你的DocumentBuilder
等仍然会被使用。
例如,您可以使用/request/@url
之类的内容获取<request/>
元素,使用/request
或请求的URL。
另一种方法 - 特别是对于可能在同一模式下处理多个文档的高性能使用场景 - 是使用SAX解析,而不是每个处理的XML元素都会收到一个事件,并给出它的名称和属性列表。
+2
现在,StAX是在附近,可能非常少的用例SAX会是一个更好的选择。 (这也是一个非常模糊的建议。) – millimoose 2012-01-08 21:26:17
你有没有尝试什么吗? – home 2012-01-08 20:02:26
你到目前为止尝试过什么?你刚刚说过你打算使用哪些课程。而“内联行中的数据”是什么意思? – dty 2012-01-08 20:02:59
我试着用tutoriels上的一些libreries,但只设法得到部分解析。在每一个导师他们使用不同的库,我不能得到涵盖我所需要的一个(或者propably我不能找出我可以使用的api工具) – 2012-01-08 20:07:42