给出以下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
的所有元素?
答案 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
的所有元素。