java - 如何将 XPath 计算范围缩小到单个节点而不是 Java 中的整个文档?

标签 java xml xpath

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/

相关文章:

java - 同一应用程序中的 JPA/Eclipselink 和 JDBC 连接

C#:XML 转换

xml - XPath 一个命名空间不同的模式

xslt - XSLT模板的歧义澄清

java - 带有查找元素命令的字符串变量 Java

java - 通过 Microsoft Exchange 发送电子邮件

java - 有没有不应该使用分析器的情况?

java - JPA - 使用中间表在同一表之间映射 OneToMany 关联

Python Zeep 客户端请求在 xml 异常中抛出错误

javascript - Indeed.com API 令人沮丧。任何人都知道我在哪里可以找到独立的提要?