Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用XPath比较具有相同名称的多个元素的值_Xml_Xpath - Fatal编程技术网

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

Xml 使用XPath比较具有相同名称的多个元素的值,xml,xpath,Xml,Xpath,给定以下XML: <Fruits> <TreeBearing> <Name>Apple</Name> </TreeBearing> <TreeBearing> <Name>Orange</Name> </TreeBearing> <TreeBearing> <Name>Grape</Name>

给定以下XML:

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

苹果
橙色
葡萄
苹果
XPath应该是什么来检查每个
是否包含单词
ple


我尝试了
/Fruits/TreeBearing/Name/text()
,但我一直只得到第一件(即苹果)。如何遍历并获取包含
ple
的所有元素

/Fruits/TreeBearing/Name[contains(text(),'ple')]
将检索所有
Name
元素

  • 其第一个子文本节点包含
    ple
    (XPath 1.0)
  • 其唯一的文本节点包含
    ple
    (XPath 2.0)。如果有多个子文本节点,这将导致错误,您需要使用
    contains(,'ple')
然而,在输入XML中,只有一个这样的元素。此外,如果有很多,XPath引擎可能只返回第一个结果

完全不相关,但“水果”不是正确的英语复数形式——它应该是“水果”



您的xpath还会返回布尔值还是苹果值

假设以下输入:

<Fruits>
  <TreeBearing>
      <Name>Apple1</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple2</Name>
  </TreeBearing>
</Fruits>
返回元素节点:

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

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

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

给定这个输入XML,表达式如下

/Fruits/TreeBearing/Name[contains(text(),'ple')]
将检索所有
Name
元素

  • 其第一个子文本节点包含
    ple
    (XPath 1.0)
  • 其唯一的文本节点包含
    ple
    (XPath 2.0)。如果有多个子文本节点,这将导致错误,您需要使用
    contains(,'ple')
然而,在输入XML中,只有一个这样的元素。此外,如果有很多,XPath引擎可能只返回第一个结果

完全不相关,但“水果”不是正确的英语复数形式——它应该是“水果”



您的xpath还会返回布尔值还是苹果值

假设以下输入:

<Fruits>
  <TreeBearing>
      <Name>Apple1</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple2</Name>
  </TreeBearing>
</Fruits>
返回元素节点:

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

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

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

如果要检查它们是否都包含值
ple
,可以使用:

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

如果要检查其中是否有任何一个包含值
ple
,可以使用:

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

最后一个选项还将用于选择包含值
ple

的所有元素。如果要检查所有元素是否都包含值
ple
,可以使用:

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

如果要检查其中是否有任何一个包含值
ple
,可以使用:

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

最后一个元素还将用于选择包含值
ple

的所有元素。例如,一个或两个元素实际包含“饼图”将非常有用。看到预期的输出也是如此。@michael.hor257k OP正在寻找ple而不是pie,例如在Apple中。一个一两个元素实际包含“pie”的示例将非常有用。看到预期的输出也是如此。@michael.hor257k OP正在寻找ple而不是pie,例如在Apple中。您的xpath是否会返回
布尔值
Apple
?@bouncinghipo它将返回元素节点。你到底想让它退回什么?请参阅我的编辑,了解一些想法。“具有包含ple的子文本节点的所有名称元素”-严格来说不是真的,它将实际返回第一个子文本节点包含ple的所有
Name
元素(XPath 1.0),或者如果任何
Name
元素具有多个子文本节点(XPath 2.0),则会导致类型错误。在这种情况下不是问题,因为所有
Name
元素都只有一个文本节点子元素,但在一般情况下,测试
而不是
text()
会更安全。@IanRoberts您是对的,但是也很容易想象
会出错的情况:如果
Name
有子元素,而子元素又包含文本节点,则不会更安全。但你是对的,我的措辞不准确——我已经编辑了我的帖子来改进它。我相信这应该是公认的答案。即使它不只是使用
XPath
功能进行比较(据我所知,这是不可能做到的),这也是所有3种功能中最完整的一种,经过表决。您的XPath是否会返回
布尔值或
Apple
?@bountinghippo它将返回元素节点。你到底想让它退回什么?请参阅我的编辑,了解一些想法。“具有包含ple的子文本节点的所有名称元素”-严格来说不是真的,它将实际返回第一个子文本节点包含ple的所有
Name
元素(XPath 1.0),或者如果任何
Name
元素具有多个子文本节点(XPath 2.0),则会导致类型错误。在这种情况下不是问题,因为所有
Name
元素都只有一个文本节点子元素,但在一般情况下,测试
而不是
text()
会更安全。@IanRoberts您是对的,但是也很容易想象
会出错的情况:如果
Name
有子元素,而子元素又包含文本节点,则不会更安全。但你是对的,我的措辞不准确——我已经编辑了我的帖子来改进它。我相信这应该是公认的答案。即使它不只是使用
XPath
功能进行比较(据我所知,这是不可能做到的),这也是所有3个选项中最完整的一个,经过投票表决。