2016-09-28 57 views
0

我有一個默認名稱空間的XML文檔。直到我發現我不得不將名稱空間映射到前綴(例如x),並使用該前綴/x:someroot/x:somechild之前,我無法像XPath那樣在其上查詢/someroot/somechild。這一切都很好,直到我想查詢具有某個屬性的元素,在這種情況下/x:someroot/x:somechild[@x:someattribute]不起作用,但是/x:someroot/x:somechild[@someattribute]的確如此。沒有在XML文檔中定義的名稱空間前綴,我希望每個節點,元素,屬性或其他名稱都繼承默認名稱空間。看來,元素已經繼承了默認的命名空間,但屬性沒有。當然,我對XML的理解是非常有限的,所以我錯過了什麼?爲什麼XPath元素繼承默認名稱空間,但屬性不會?

我使用的是.NET XmlDocument對象作爲我的文檔來查詢,一個XmlNamespaceManager對象到文檔的默認名稱空間映射到一個前綴,而SelectSingleNode(String, XmlNamespaceManager)方法對文檔進行查詢。

+0

的可能的複製[XML默認命名爲不合格的屬性名稱?](http://stackoverflow.com/questions/3312390/xml-default-namespaces-for-unqualified-attribute-names) –

+1

當你問「爲什麼?「,你期待什麼樣的答案?你想知道XML名稱空間工作組成員在做出設計決定時給出的基本原理嗎?或者你想要某種第三方的理由,爲什麼這可能是一個合理的決定?或者你只是想要一個指向規範中規則的指針,是的,這是它的工作方式? –

+0

是一個dup,但我得到了我喜歡的答案。你會推薦我做什麼? –

回答

4

這就是命名空間規範必須對此事說:

默認命名空間聲明並不直接適用於屬性 名稱;前綴屬性的解釋由它們出現的元素決定。

沒有理由說明爲什麼規範的作者做出了這個決定。

有人指出,這種說法其實很模糊。例如,它沒有說沒有前綴的屬性不在名稱空間中,並且沒有說它們與包含的元素在同一個名稱空間中,但是兩種解釋都可以合理地採用。對於一個明確的說法,你要看看XPath 1.0規範該條規定明確:

命名空間屬性的名稱的URI將是無效的,如果在 qname的屬性沒有前綴。

此外,沒有給出任何基本原理(除非編輯們強烈需要證明自己的理由,否則規範不會給出理由)。但的XPath 1.0規範的編輯是詹姆斯·克拉克,詹姆斯·克拉克寫在這裏的教程

http://www.jclark.com/xml/xmlns.htm

這給線索,他對一般的命名空間思維;但沒有理由爲這個特別的決定,他只是重申:

請注意,xmlns屬性不影響前綴名稱 名稱。

相關問題