XPath获取包含文本的节点

48
我尝试搜索在“/doc/story/content”下包含文本“Yahoo”的节点,它返回了“content”节点,但我需要确切包含“Yahoo”文本的节点或其父节点。
<doc>
    <story>
        <content id="201009281450332423">
            <ul>MSW NYNES NYPG1 DILMA</ul>
            <p> <k> Yahoo, made </k> it nice </p>
            <p>
               <author>-v-</author>
            </p>
        </content>
    </story>
</doc>

Xpath:"/doc/story/content[contains(., 'Yahoo')]"

2个回答

59

由于你只需要包含文本Yahoo的所有文本节点,因此使用以下XPath。

//text()[contains(., 'Yahoo')]
这应该只返回包含“Yahoo”(区分大小写)的所有文本节点。

1
这个答案和@Jon的有什么区别? - Nakilon
不区分大小写://text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÉÈÊÀÁÂÒÓÔÙÚÛÇÅÏÕÑŒ', 'abcdefghijklmnopqrstuvwxyzäöüéèêàáâòóôùúûçåïõñœ'),'yahoo')] - Stefan Steiger

42

你的XML格式有误。应将</content></doc></story>更改为</content></story></doc>

除此之外,您需要使用的XPath是:

/doc/story/content//*[contains(., 'Yahoo')]

(选择<content>的任何后代,其中包含文本“Yahoo”-- 这将选择<p>


如果只有一层嵌套,这个方法很好用。如何使其适用于多层嵌套的标签? - Vjy
@Vjy:我不确定你的意思。你能举个例子吗? - Jon
1
text() 是一个节点测试,而不是字符串。contains() 函数需要字符串作为参数。请参考 https://dev59.com/hmkx5IYBdhLWcg3wA_xS#9493870。你的解决方案可能看起来可行,但如果文本节点包含在其他文本节点中,则会失败。 - Jason S
@JasonS:我没想到那种情况(你是如何用程序解决的?)。我已经修正了回答。感谢指出,我觉得学到了新东西。 - Jon
@Jon 我按照你更新的答案进行了操作。我正在使用PHP SimpleXMLElement从odt文件中获取文本节点的内容。odt文件通常包含带有制表符和空格的段落,例如<text:p Hello<text:s/><text:tab/>Jon</text:p>,在这种情况下,使用contains(text(),"Jon")进行搜索将失败,但是contains(.,"Jon")将起作用。 - Jason S
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接