使用Xpath 2.0提取和分组所有文本节点

时间:2012-01-14 14:26:05

标签: xml xpath

我想从特定文档的子节点中提取所有文本,并返回一个文本数组。我认为在一个例子中展示它会更容易:

给出文件:

<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()子节点?

3 个答案:

答案 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(.)

中获取所需的结果