有幾種技巧可以嘗試;您使用哪種方法將取決於您需要從文檔中獲取哪些信息,您希望的嚴格程度以及您使用的XPath實施的一致性。
獲取與特定前綴關聯的名稱空間URI的一種方法是使用軸namespace::
。這將爲您提供一個名稱空間節點,其名稱是前綴,其值是名稱空間URI。例如,你可以得到使用路徑的文檔元素上的默認命名空間URI:
/*/namespace::*[name()='']
你也許可以用它來建立的命名空間協會爲您的XPathNavigator。不過要注意的是,namespace::
軸是XPath 1.0的其中一個角落,並不總是被實現。
獲得該名稱空間URI的第二種方法是在文檔元素上使用namespace-uri()
函數(您所說的將始終在該名稱空間中)。表達式:
namespace-uri(/*)
會給你那個名字空間。
另一種方法是忘記將前綴與該名稱空間關聯,並使路徑無名稱空間。您可以通過使用local-name()
函數來執行此操作,無論何時您需要引用其名稱空間不明的元素。例如:
//*[local-name() = 'Element']
你可以走一步,並測試對文檔元素的一個元素的命名空間URI,如果你真的想:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
最後一個選擇,因爲命名空間似乎對你來說毫無意義,將通過一個過濾器去除命名空間來運行你的XML。那麼您就不必擔心XPath中的這些問題。要做到這一點,最簡單的方法是簡單地使用正則表達式刪除xmlns
屬性,但你可以做一些事情,如果你需要同時做其他的整理更加複雜。
在默認名稱空間始終是誰的?還是你曾經有: xmlns:myns =「namespace-uri」 你也讀完整個文件到一個DOM文檔或解析使用像XmlValidatingReader? – Kev 2008-09-23 17:36:27
他們總是在默認名稱空間。 我還沒有完全讀完這個文件,因爲我在這個問題上陷入困境;我想我不是完全理解你什麼時候問「到一個DOM文檔或使用像XmlValidatingReader解析」;我只會使用XPath來閱讀XML;它不好嗎? – 2008-09-23 18:22:38