我正在尝试使用XPath从XHTML页面中的节点提取文本,但是我无法收集给定节点下面的所有文本。
问题是,节点(例如,参见下面示例中的p元素)可以有多个子节点(例如" b"和#34; em" )和散布的多个文本片段(" aaaa"," bbbb"和" cccc")。然而,我的XPath表达式" p / text()"只返回第一个文本" aaaa"而我需要直接在p节点下面收集所有文本片段,即我想获得" aaaabbbbcccc" (但不是foo和bar)。如何教XPath收集所有文本并将它们作为一个串联字符串返回?
...
<p>
aaaa
<b>foo</b>
bbbb
<em>bar</em>
cccc
</p>
...
或者:获取所有文本片段列表的XPath表达式是什么,所以我可以在我的代码中以编程方式连接它们?
答案 0 :(得分:2)
如果它们是文本节点,则您的XPath表达式已经返回 p
元素的所有直接子元素。只是你的XPath引擎或库只返回第一个结果。
要确定这是真的,请使用不同的引擎运行相同的XPath表达式,例如在http://xpath.online-toolz.com/tools/xpath-editor.php上。在那里,使用
<p>
aaaa
<b>foo</b>
bbbb
<em>bar</em>
cccc
</p>
作为输入,//p/text()
作为路径表达式(单个结果由--------
分隔):
[WHITESPACE-ONLY LINE]
aaaa
-----------------------
bbbb
-----------------------
cccc
[WHITESPACE-ONLY LINE]
如果你不介意p
的孩子内部的文字也在输出,你可以使用
string(//p)
会产生
[WHITESPACE-ONLY LINE]
aaaa
foo
bbbb
bar
cccc
[WHITESPACE-ONLY LINE]
要准确获得您要求的输出,您需要提供更多信息(请参阅您的问题的评论)。
答案 1 :(得分:1)
如果我将示例XML复制到Notepad ++并使用XPathenizer,则XPath表达式/p/text()
可以正常工作。
这表明XPath表达式很好,故障位于其他地方。