2012-02-21 80 views
1

假設我有這樣的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

回答

1

在文本節點上沒有這樣的名稱空間;您的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

1

如果我想找到具有文本節點在該命名空間的所有元素 (如元素「三化」),是什麼,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

相關問題