使用Xpath检查XML中重复节点下的节点是否存在



我有以下XML,

<Root>
<Node>
<Child>ch</Child>
<Child>ch1</Child>
</Node>
<Node>
<Child>ch2</Child>
<Child>ch3</Child>
</Node>

我想检查XML中的所有节点是否至少有一个子节点。如果我使用boolean(//Node/Child),它将检查整个XML,并且不会抱怨任何Node没有。有一个子节点。如果我用一个谓词来表示位置,它会起作用布尔(//节点[1]/孩子)。

谢谢Sugata

Child计数为0时,Nodes计数是可能的

not(count(//Node[count(Child) = 0]) > 0)

给定

<Root>
<Node>
<Child>ch</Child>
<Child>ch1</Child>
</Node>
<Node>
<Child>ch2</Child>
<Child>ch3</Child>
</Node>
<Node/>
</Root>

测试失败,有空的Node元素。也就是说,空元素的个数大于0。

xmllint --xpath 'not(count(//Node[count(Child) = 0]) > 0)' test.xml; echo
false

删除<Node/>

xmllint --xpath 'not(count(//Node[count(Child) = 0]) > 0)' test.xml; echo
true

如果存在2个空节点

xmllint --xpath 'count(//Node[count(Child) = 0])' test.xml; echo
2

可靠的XPath-2.0解决方案将使用如下的量化表达式:

every $x in /Root/Node satisfies count($x/*)

这里使用的事实是,count(...)函数的所有大于零的值都被解释为TRUE。明确地说,它应该是count($x/*) > 0

最新更新