使用XPath比较具有相同名称的多个元素的值

时间:2015-03-10 13:22:10

标签: xml xpath

给出以下XML:

<Fruits>
  <TreeBearing>
      <Name>Apple</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple</Name>
  </TreeBearing>
</Fruits>

XPath应该检查每个<Name>是否包含单词ple

我尝试/Fruits/TreeBearing/Name/text()并且我一直只获得第一项(即Apple)。如何遍历并获取包含ple的所有元素?

2 个答案:

答案 0 :(得分:3)

准确地给出了这个输入XML,像

这样的表达式
/Fruits/TreeBearing/Name[contains(text(),'ple')]

将检索所有 Name元素

  • 其第一个子文本节点包含ple(XPath 1.0)
  • 其唯一的文本节点包含ple(XPath 2.0)。如果有多个子文本节点,则会导致错误,您需要使用contains(.,'ple')

然而,在您的输入XML中,只有一个这样的元素。此外,如果有很多,您的XPath引擎可能只返回第一个结果。

完全不相关,但“水果”不是一个正确的英文复数形式 - 它应该是“水果”。


  

你的xpath也会返回一个布尔值或Apple吗?

假设以下输入:

<Fruits>
  <TreeBearing>
      <Name>Apple1</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple2</Name>
  </TreeBearing>
</Fruits>

此路径表达式:

/Fruits/TreeBearing/Name[contains(text(),'ple')]

返回元素节点

<Name>Apple1</Name>
-----------------------
<Name>Apple2</Name>

另一方面,

/Fruits/TreeBearing/Name[contains(text(),'ple')]/text()

仅返回这些节点的文本内容:

Apple1
-----------------------
Apple2

最后,要返回表示输入中是否存在此类节点的布尔值,请使用

boolean(/Fruits/TreeBearing/Name[contains(text(),'ple')])

答案 1 :(得分:2)

如果您想检查所有是否包含值ple,您可以使用:

not(/Fruits/TreeBearing/Name[not(contains(., 'ple'))])

如果您想检查中的任何是否包含值ple,您可以使用:

/Fruits/TreeBearing/Name[contains(., 'ple')]

最后一个也适用于选择包含值ple的所有元素。