使用XPath

时间:2015-09-21 14:37:46

标签: xml xpath

我需要在xml文件中找到一个子节点,该文件位于递归的父子属性中。这是一个xml示例:

<root>
    <element>
        <nodeA>
            <nodeB>
                <nodeA>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>
                            <nodeB></nodeB>
                            <nodeB></nodeB>         
                        </nodeA>
                    </nodeB>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>
                            <nodeB></nodeB>                     
                        </nodeA>            
                    </nodeB>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>                     
                        </nodeA>            
                    </nodeB>                        
                </nodeA>
            </nodeB>
            <nodeB>
                <nodeA>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>                     
                        </nodeA>
                    </nodeB>            
                </nodeA>            
            </nodeB>
        </nodeA>
    </element>
</root>

我可以找到没有nodeA子节点的所有节点:

  

//节点B [否(nodeA上)]

但是我需要选择没有nodeB孩子的第一个(也是唯一一个)nodeA组,实际上是第一个三个出现nodeB个上面的例子。

2 个答案:

答案 0 :(得分:1)

这是

(//nodeA)[nodeB[not(nodeA)]][1]/nodeB

你的XPath几乎是正确的 - 你只需要在一个级别上UP(到nodeA组)并选择第一个。请注意,XPath集合是1索引而不是经典的0索引。

UPD:并使用圆括号来正确控制运营商的优先级。

答案 1 :(得分:1)

通过您已经获得的查询,您距离您想要的只有几步之遥。

//nodeB[not(nodeA)]开始,您希望将一个级别提升到父级/..,但您只需要第一个组的父级(//nodeB[not(nodeA)]/..)[1],当然您希望没有子级的nodeBs nodeAs为最终结果:

(//nodeB[not(nodeA)]/..)[1]/nodeB[not(nodeA)]