2015-02-23 49 views
1

我想从使用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我的代码?

+0

这实际上取决于XPath的版本和您使用的工具/环境/编程语言。请修改您的帖子并添加此信息。 – 2015-02-23 23:28:02

+0

谢谢你的回应!很高兴看到问题不在于我的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

+0

对Java不太熟悉,但您可以在增加位置的同时查找文本节点。开始选择'/ p/text()[1]',然后尝试'/ p/text()[2]'等等,直到结果集为空。(对于将来的问题,请立即包含此信息,并使用您使用的编程语言标记问题。) – 2015-02-24 10:17:48

回答

1

如果我将示例XML复制到Notepad ++并使用XPathenizer,则XPath表达式/p/text()可以正常工作。

enter image description here

这表明XPath表达式是罚款和故障不在于此。

+0

这是Notepad ++的一个非常酷的功能!使它值得考虑它作为我未来的文本编辑器... – mmo 2015-02-25 00:34:26

+2

是的,它确实是一个很好的功能!如果你的问题已经解决了,你能否将其中一个答案标记为已答复? :) – Andersnk 2015-02-25 13:09:37

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] 

为了准确获得您要求的输出,您需要提供更多信息(请参阅您的问题的评论)。