xpath检查文档是否包含文本

时间:2014-08-26 12:31:13

标签: xml xpath

我想获取包含指定文本的所有XML节点。例如,在搜索文本时#a; aa"在文件中:

<book>
 <content>
    aaaaaaa
    <markup/>
    bbbbbb
 </content>
 <author>
 aabbcc
 </author>
</book>

我应该获得节点contentauthor

我试图使用XPath&#34; // * [包含(text(),&#39; aa&#39;)]#34;但是当节点有一些分割文本的子节点时会失败(例如markup在上面的例子中分割content)。

你知道如何解决这个问题吗?

1 个答案:

答案 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 1.0中,第一项是从序列
  • 中选择的
  • 在Xpath 2.0中,函数执行所有项目或所有值的串联

显然,你正在使用XPath 2.0,因为在XPath 1.0中,你的表达式不会给你带来麻烦,因为你提供了XML。但它依赖于&#34; aa&#34;必须作为content第一个文本节点的一部分出现。