XPath:如何从XHTML节点收集多个文本片段?
问题描述:
我想从使用XPath的XHTML页面中的节点中提取文本,但我无法收集给定节点下的所有文本。XPath:如何从XHTML节点收集多个文本片段?
的问题是,一个节点(例如,参见下面的实施例的p元件)可以具有多个子节点(在本例中例如“b”和“EM”)和多个文本片段穿插(“AAAA “,”bbbb“和”cccc“)。然而,我的XPath表达式“p/text()”仅返回第一个文本“aaaa”,而我需要直接在p-node下收集所有文本片段,即我想获得“aaaabbbbcccc”(但不是foo和酒吧)。我如何教XPath收集所有文本并将它们作为一个串联的字符串返回?
...
<p>
aaaa
<b>foo</b>
bbbb
<em>bar</em>
cccc
</p>
...
或者:什么是XPath表达式来获取所有文本片段的列表,这样我就可以将它们连接起来programmaticallyin我的代码?
答
您的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]
为了准确获得您要求的输出,您需要提供更多信息(请参阅您的问题的评论)。
这实际上取决于XPath的版本和您使用的工具/环境/编程语言。请修改您的帖子并添加此信息。 – 2015-02-23 23:28:02
谢谢你的回应!很高兴看到问题不在于我的XPath表达 - 我真的在挠挠我的脑袋! Re。使用的工具和环境:我使用JTidy r938来解析(X)HTML页面,并生成DOM和Java 1.8的内置XPath实现(package javax.xml.xpath)来定位节点。显然后者只返回第一个文本值,如果返回类型是STRING,而不是所有的连接。如果我返回一个NODESET,我确实会得到所有文本的列表,然后我需要在我的代码中进行连接。我希望XPath能为我做到这一点。 – mmo 2015-02-24 10:14:04
对Java不太熟悉,但您可以在增加位置的同时查找文本节点。开始选择'/ p/text()[1]',然后尝试'/ p/text()[2]'等等,直到结果集为空。(对于将来的问题,请立即包含此信息,并使用您使用的编程语言标记问题。) – 2015-02-24 10:17:48