我想获取包含指定文本的所有XML节点。例如,在搜索文本时#a; aa"在文件中:
<book>
<content>
aaaaaaa
<markup/>
bbbbbb
</content>
<author>
aabbcc
</author>
</book>
我应该获得节点content
和author
。
我试图使用XPath&#34; // * [包含(text(),&#39; aa&#39;)]#34;但是当节点有一些分割文本的子节点时会失败(例如markup
在上面的例子中分割content
)。
你知道如何解决这个问题吗?
答案 0 :(得分:3)
使用以下XPath表达式:
"//*[text()[contains(.,'aa')]]"
它找到任何元素节点,其文本节点包含&#34; aa&#34;。
content
中有多个文字节点。表达式如下:
//*[contains(text()[1],'aa')]
也会返回content
元素,因为然后选择了第一个文本节点。
顺便说一句,如果content
的所有文本节点都包含&#34; aa&#34;:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<content>
aaaaaaa
<markup>aaa</markup>
aaa
</content>
<author>
aabbcc
</author>
</book>
您的初始XPath表达式将返回content
元素。只是在您显示的实际XML输入中,同时有content
的文本节点包含&#34; aa&#34;以及其他没有的人。
此外,行为取决于您的XPath版本。更准确地说,当一个只能处理单个节点作为参数的函数被传递给一系列节点时,
显然,你正在使用XPath 2.0,因为在XPath 1.0中,你的表达式不会给你带来麻烦,因为你提供了XML。但它依赖于&#34; aa&#34;必须作为content
的第一个文本节点的一部分出现。