XML命名空間

求聞百科,共筆求聞

XML命名空間XML namespace,也譯作XML名稱空間XML名字空間)用於在一個XML文檔中提供名字唯一的元素和屬性。XML命名空間在W3C推薦規範《Namespaces in XML》 中定義。XML命名空間於1999年1月14日成為W3C的推薦規範。

W3C將XML命名空間定義為以國際化資源標識符Internationalized Resource IdentifierIRI)引用為標識的元素名和屬性名的集合。

使用命名空間的動機

一個XML文檔可能包括來自多個XML詞彙表的元素或屬性,如果每一個詞彙表指派一個命名空間,那麼相同名字的元素或屬性之間的名稱衝突就可以解決。舉一個簡單的例子來說,在一個訂單的XML文檔中需要引用到客戶和所購買的產品,customer元素和product元素可能都有一個叫做id的子元素。這時候要引用id元素會造成名稱衝突,但是如果將兩個id元素放到不同的命名空間中就會解決這個問題。

聲明和引用命名空間

命名空間使用元素的屬性來聲明,比如:

xmlns:xhtml="http://www.w3.org/1999/xhtml"

其中:

命名空間的聲明就是將一個前綴與一個URI關聯起來。

聲明命名空間時,可以為命名空間定義前綴(見前例)。為命名空間定義前綴,而不直接使用命名空間的URI是因為URI為了唯一通常會很長,直接使用URI不但造成書寫和閱讀的不便,還會擾亂XML的語法。聲明命名空間時,也可以不定義前綴。如:

xmlns="http://www.w3.org/1999/xhtml"

未定義前綴的命名空間將被用作預設的命名空間。

命名空間的URI僅僅是唯一的標識符,推薦規範不要求,也不建議通過其獲取信息。XML解析器處理命名空間URI時,也僅僅將其作為字符串。例如,地址為http://www.w3.org/1999/xhtml 的文檔並不包含任何代碼,它僅僅為人類閱讀者描述了XHTML命名空間。之所以採用URI(如"http://www.w3.org/1999/xhtml")來標識命名空間是因與使用簡單的字符串(如xhtml)相比,URI大大降低了命名空間重名的可能性。

XML文檔中的元素名和屬性名可以使用限定名或非限定名,限定名由命名空間的前綴和局部名組合而成,例如"xhtml:hr"。非限定名只有局部名,沒有前綴。非限定名被認為屬於預設命名空間,如果預設命名空間沒有定義,則屬於無命名空間

在一個元素中聲明的命名空間,在所有子元素中也有效,一種通常的做法是在XML文檔的根元素聲明所有命名空間。在子元素中聲明的命名空間的前綴可以覆蓋父元素中聲明的前綴。W3C推薦規範Namespaces in XML 1.1允許取消命名空間的聲明,如:

xmlns:xhtml=""

命名空間的名稱

雖然術語命名空間的URI被廣泛使用,W3C推薦規範稱之為命名空間的名稱。規範並未強制規定命名空間的名稱必須使用URI(即當解析器發現命名空間不是一個合法的URI時應該拒絕該文檔),實際上許多XML的解析器允許使用任何字符串。在推薦規範的1.1版,命名空間的名稱變成了國際化資源標識符(IRI),IRI允許使用非ASCII碼的字符,實際上,非ASCII碼字符已經被幾乎所有的XML軟體所接受。但是命名空間的URI一詞還在持續使用,在W3C和其他地方的許多規範中也有使用。

隨著命名空間推薦規範的發布,在如何處理相對的URI問題上產生了激烈的爭論,一方認為相對的URI應當簡單地當作字符串處理,而另一方認為應該根據文檔的基準URI將其轉換為絕對的URI。[1]。W3C對這一爭論的裁定是不贊成使用相對的URI的。[2].

命名空間的URI與HTTP協議沒有任何正式的關係,然而HTTP協議形式的URL(例如http://www.w3.org/1999/xhtml)還是被廣泛的用作命名空間的URI。規範並未說明如果這樣的URL被解引用(dereference,也就是說,如果軟體試圖從該位置獲取一個文檔)會發生什麼。在這個問題上存在著不同的看法,有些人認為應該在該位置放置一個 RDDL文檔[3]。但是總的來說,用戶應該假定命名空間的URI只是一個簡單的名稱,而非全球資訊網上文檔的地址。

命名空間宣言

當一個元素帶有屬性xmlns="",該元素的默認命名空間和它的後代將恢復為「無命名空間」:那就是在任何命名空間裡頭都不被視為前綴名稱。

參考文獻

  1. Leigh Dodds, News from the trenches, 24 May 2000 
  2. Dan Connolly, W3C XML Plenary decision on relative URI references in namespace declarations, 11 Sep 2000 
  3. Elliotte Rusty Harold, RDDL Me This: What Does a Namespace URL Locate?, 20 Feb 2001 

外部連結

參見