Xml 使用XPath比较具有相同名称的多个元素的值
给定以下XML:Xml 使用XPath比较具有相同名称的多个元素的值,xml,xpath,Xml,Xpath,给定以下XML: <Fruits> <TreeBearing> <Name>Apple</Name> </TreeBearing> <TreeBearing> <Name>Orange</Name> </TreeBearing> <TreeBearing> <Name>Grape</Name>
<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
元素
- 其第一个子文本节点包含
(XPath 1.0)ple
- 其唯一的文本节点包含
(XPath 2.0)。如果有多个子文本节点,这将导致错误,您需要使用ple
contains(,'ple')
您的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
元素
- 其第一个子文本节点包含
(XPath 1.0)ple
- 其唯一的文本节点包含
(XPath 2.0)。如果有多个子文本节点,这将导致错误,您需要使用ple
contains(,'ple')
您的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个选项中最完整的一个,经过投票表决。