XML 流
<l>
<i>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
</i>
<i>
<a>AAA2</a>
<b>BBB2</b>
<c>CCC2</c>
</i>
<i>
...
</i>
</l>
我想用一些 Java 代码输出以下文本:
> CCC
> CCC2
...
这是我为产生预期结果而编写的代码:
Java代码
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document d = docBuilder.parse("file:///C:/path/to/my/xml/stream.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//i");
NodeList listOfiNodes = (NodeList) expr.evaluate(d, XPathConstants.NODESET);
for(int i=0;i<listOfiNodes.getLength();i++) {
XPathExpression expr2 = xpath.compile("//c");
System.out.println("> " + ((Node) expr2.evaluate(listOfiNodes.item(i), XPathConstants.NODE)).getTextContent());
}
expr2
继续返回第一个 c
节点。所以我得到这个输出:
> CCC
> CCC
...
由 expr2
执行的评估似乎没有“停留”在传递给 evaluate()
方法的节点上。为什么?
NOTA:我不想直接使用 xpath //i/c
(或 /l/i/c
)。
Java 6
最佳答案
//c
选择整个文档中所有匹配的节点。使用 c
代替,您将收到以下输出:
> CCC
> CCC2
请注意,如果打印结果的行中的节点 i
不包含 c
,您将得到 NPE。以下代码应该按预期工作:
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document d = docBuilder.parse("stream.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//i");
NodeList listOfiNodes = (NodeList) expr.evaluate(d, XPathConstants.NODESET);
for (int i = 0; i < listOfiNodes.getLength(); i++) {
javax.xml.xpath.XPathExpression expr2 = xpath.compile("c");
Node item = listOfiNodes.item(i);
Node node = (Node) expr2.evaluate(item, XPathConstants.NODE);
if (null != node) {
System.out.println("> " + node.getTextContent());
}
}
关于java - 如何将 XPath 计算范围缩小到单个节点而不是 Java 中的整个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777754/