我想从特定文档的子节点中提取所有文本,并返回一个文本数组。我认为在一个例子中展示它会更容易:
给出文件:
<root>
<div>
some text
<p>some other text</p>
</div>
<div>
another text
<b>yet another text <em>even more</em></b>
end of text
</div>
</root>
我想构造一个返回两个元素的表达式:
[0] some text someother text
[1] another text yet another text even more end of text
我尝试了很多表达式,但我似乎在这里遗漏了一些东西,很容易单独提取div(只是// div)但是如何将它们分组并分别加入每个div中的所有text()子节点?
答案 0 :(得分:1)
text()
是你的朋友:
您必须分两步完成此操作。
//div
然后:
//text()
然后以编程方式合并它们。
XPath是一种查询语言,就像CSS选择器一样,无法转换。所有函数(如normalize-text
)都可以优化您的选择器,而不是修改输入本身。
请参阅:how to get the normalize-space() xpath function to work?
答案 1 :(得分:1)
使用XPath 2.0(并假设您的输入格式正确且添加了一些</b>
),您可以使用类似/root/div/normalize-space()
的路径,它会为您提供两个字符串的序列“一些文本其他文本”和“另一个文本,另一个文本甚至更多的文本结束”。
答案 2 :(得分:0)
XPath无法构造新节点:为此您需要XSLT或XQuery。因此,表达式永远不会返回源文档中不存在的元素。但是,使用XPath 2.0,您可以轻松返回两个字符串:除了较小的空白详细信息,您可以从表达式//div/normalize-space(.)