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

问题描述:

假设我有这样的XML:如何使用XPath在具有命名空间的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”命名空间的所有元素(如元素“1”) ,我可以用这个:

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

如果我想找到具有该命名空间属性的所有元素(如元素“二”),我可以用这个:

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

如果我想去nd在该名称空间中具有文本节点的所有元素(如元素“3”),我可以使用哪种XPath?

允许XPath 1或2。谢谢。

+1

命名空间适用于节点(可能还有属性)。在文本节点的文本中,没有名称空间的概念。这都只是文字。 – 2012-02-21 17:51:37

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

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

怎么办? – mindandmedia 2012-02-21 17:57:48

+0

@mindandmedia:是的,它呢? – 2012-02-21 18:01:27

+0

@mindandmedia,我想我在我原来的帖子中回答了你的问题。看一看。 – 2012-02-21 18:02:21

如果我想找到具有文本节点在该命名空间的所有元素 (如元素“三化”),是什么,XPath可我用?

只有有名字的节点可以在一个命名空间

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

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

因此,有没有像“在命名空间文本节点” ......

在这种特殊情况下,你可以使用这个XPath表达式选择需要的元素:

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

这选择XML文档中至少包含一个以字符串"foo:"开头的字符串值的子节点子元素。

+0

很好的解释,谢谢 – 2012-02-21 19:52:31

+0

@ james.garriss:我很高兴我的回答对你有用,请考虑接受和/或提升它。 – 2012-02-21 19:58:05