我需要在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
个上面的例子。
答案 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)]