XPath用于识别某些子元素组

4

假设我有以下XML:

<group>
  <request>
    <field id="a"/>
    <field id="b"/>
    <field id="c"/>
  </request>
  <request>
    <field id="a"/>
    <field id="b"/>
    <field id="d"/>
  </request>
</group>

请注意,<request>元素的顺序不能保证。
我想要提供两个XPath表达式,第一个是检查是否存在具有子元素a、b和c的<request>,第二个是检查是否存在具有子元素a、b和d的<request>
我应该如何指定这些内容?我最接近的方法使用了编号谓词语法,但我错过了一些关于如何指定多个子匹配的细节,而且<request>元素的顺序未定义也使我感到困惑。
提前致谢。
Glenn。
2个回答

2

我想提供两个XPath表达式,第一个表达式检查是否存在具有子元素abc<request>,第二个表达式检查是否存在具有子元素abd<request>

用途:

boolean(/*/request[field[@id='a'] and field[@id='b'] and field[@id='c']])

对于第二个表达式,请使用

boolean(/*/request[field[@id='a'] and field[@id='b'] and field[@id='d']])

1

这不就是你要找的吗?

request[field[@id = 'a'] and field[@id='b'] and field[@id='c']]

?


谢谢,我之前没有意识到谓词可以这样嵌套。 - Glenn
1
Emma,这将选择“request”元素(或不选择任何内容)。实际上,OP希望在评估XPath表达式的结果中产生布尔值。 - Dimitre Novatchev
谢谢你的澄清,Dimitre。然而在这种情况下,我正在使用XMLUnit中的assertXPathExists()方法,只要XPath返回了结果,那么对于我的目的来说就可以了。 - Glenn
@Glenn,我的回答更通用,因此适用于更多的用例。特别是,它不依赖于assertXpathExists()和XMLUnit的可用性,并且可以在许多其他情况下使用。因此,即使读者没有使用XMLUnit(顺便说一句,您在问题中没有提到),她也可以直接使用我的答案。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接