XPath表达式:选择元素节点之间的文本节点

3

基于以下 HTML,我想提取 TextA、TextC 和 TextE。

<div id='content'>
    TextA
    <br/>
    <br/>
    <p>TextB</p>
    TextC
    <br/>
    TextC
    <p>TextD</p>
    TextE
</div>

我尝试这样获取TextC,但我没有得到想要的结果:
查询: //*[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]] 期望的结果: ["TextC", <br/>, "TextC"] 实际结果: [<br/>] 是否有一种方法可以选择文本节点而不使用索引,例如//div/text()[1]

你的问题非常不清楚。在第一行中,你说“我想提取TextA、TextC和TextE”,但后来又谈到要选择["TextC", <br/>, "TextC"]。请明确解释你想做什么。 - JLRishe
明白了。我确实想要提取所有文本节点,我的查询只是一个我尝试做的示例。 - Michael Wyss
1个回答

4

两个文本节点未出现在您的XPath结果中的原因是因为*只匹配元素。要匹配元素和文本节点,您可以改用node()

//node()[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]]

演示

或者,如果您只想获取文本节点,即不包括<br/>,则可以使用text()而不是node()

//text()[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]]

1
在代码中修复了一个复制粘贴错误。+1。顺便说一句,@OP如果您能确保所引用的<p>元素与文本节点处于同一级别,那么使用preceding-siblingfollowing-sibling而不是precedingfollowing可能会获得更好的效率。根据您将如何广泛地将此技术应用于不同的XML输入,您甚至可能需要preceding-sibling::p[1]以获得更高的特异性和效率。 - LarsH
这正是我一直在寻找的。谢谢! - Michael Wyss

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