如何使用XPath在带有命名空间的XML文档中查找所有文本节点?

时间:2012-02-21 17:46:14

标签: xml xpath xml-namespaces

假设我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://www.foo.com">
    <foo:one>Alpha</foo:one>
    <two foo:Dog="Yorkie">Bravo</two>
    <three>foo:Delta</three>
</root>

如果我想使用XPath查找“http://www.foo.com”命名空间中的所有元素(例如元素“one”),我可以使用:

//*[namespace-uri()='http://www.foo.com']

如果我想查找在该命名空间中具有属性的所有元素(例如元素“two”),我可以使用它:

//@*[namespace-uri()='http://www.foo.com']

如果我想查找在该命名空间中有文本节点的所有元素(例如元素“three”),我可以使用什么XPath?

允许XPath 1或2。感谢。

2 个答案:

答案 0 :(得分:1)

文本节点上没有命名空间;您的three节点只包含文本foo:Delta,它在XML中没有特殊含义。您可以使用foo:找到以starts-with开头的文字节点:

//*[starts-with(., "foo:")]

答案 1 :(得分:1)

  

如果我想查找该命名空间中有文本节点的所有元素   (例如元素“three”),我可以使用什么XPath?

只有名称的节点可以在命名空间中

因此:文本节点,注释和文档节点没有(属于)命名空间。

PI的名称也不属于任何名称空间。

因此,没有什么比“该命名空间中的文本节点”......

在这种特殊情况下,您可以使用此XPath表达式选择所需元素

//*[text()[starts-with(., 'foo:')]]

这将选择XML文档中具有至少一个text-node子元素的任何元素,该子元素的字符串值以字符串"foo:"开头。