XPath:如何从XHTML节点收集多个文本片段?

时间:2015-02-23 22:16:12

标签: java xpath xhtml

我正在尝试使用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表达式是什么,所以我可以在我的代码中以编程方式连接它们?

2 个答案:

答案 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()可以正常工作。

enter image description here

这表明XPath表达式很好,故障位于其他地方。