使用Xpath查找特定节点的后代

时间:2014-01-22 15:06:23

标签: xml xpath

假设我有一个xml文档,并希望从每个节点中获取“NodeID”和“Description”元素,而不必知道它们是某个孩子的子元素,还是只是一个孩子。

<Stuff>
    <data>
        <Nodes>
            <NodeID>1</NodeID>
            <Name>thingA</Name>
            <MoreInfo>
                <Description>Scooter</Description>
            </MoreInfo>
        </Nodes>
        <Nodes>
            <NodeID>2</NodeID>
            <Name>thingB</Name>
            <MoreInfo>
                <Description>Bike</Description>
            </MoreInfo>
        </Nodes>
    </data>
</Stuff>

所以我最终会得到:1,踏板车; 2,自行车。

NodeList nodes = (NodeList) xpath.evaluate("Nodes", resultXml, XPathConstants.NODESET);

for (int i = 0; i < nodes.getLength(); i++) {
    Node node = nodes.item(i);
    logger.info("Evaluating: " + node.toString());

    String nodeID = xpath.evaluate("//NodeID", node);
    String description = xpath.evaluate("//DescriptionID", node);

    System.out.println("Found: " + nodeID + ", " + description);
}

输出如下:

Evaluating: <NodeID>1</NodeID><Name>thingA</Name><MoreInfo><Description>Scooter</Description></MoreInfo>
Found: 1, Scooter
Evaluating: <NodeID>2</NodeID><Name>thingB</Name><MoreInfo><Description>Bike</Description></MoreInfo>
Found: 1, Scooter

节点是正确的,但它保持“发现”的东西,好像它是从xml文档的开头看。如何只搜索相关节点的后代?我认为作为评估源的节点可以解决这个问题......

1 个答案:

答案 0 :(得分:2)

//NodeID//Description绝对路径,它们将从包含上下文节点的文档的根开始搜索。这种情况下的表达式将匹配整个文档中名为NodeID(分别为Description)的所有节点,当您将这样的表达式计算为字符串时,这将为您提供第一个匹配节点的字符串值按文件顺序。

要查看上下文节点本身,您需要通过添加前导点来使用 relative 路径,例如.//NodeID