XML命名空間
XML命名空間(XML namespace,也譯作XML名稱空間、XML名字空間)用於在一個XML文檔中提供名字唯一的元素和屬性。XML命名空間在W3C推薦規範《Namespaces in XML》 (頁面存檔備份,存於網際網路檔案館)中定義。XML命名空間於1999年1月14日成為W3C的推薦規範。
W3C將XML命名空間定義為以國際化資源標識符(Internationalized Resource Identifier,IRI)引用為標識的元素名和屬性名的集合。
使用命名空間的動機
一個XML文檔可能包括來自多個XML詞彙表的元素或屬性,如果每一個詞彙表指派一個命名空間,那麼相同名字的元素或屬性之間的名稱衝突就可以解決。舉一個簡單的例子來說,在一個訂單的XML文檔中需要引用到客戶和所購買的產品,customer元素和product元素可能都有一個叫做id的子元素。這時候要引用id元素會造成名稱衝突,但是如果將兩個id元素放到不同的命名空間中就會解決這個問題。
聲明和引用命名空間
命名空間使用元素的屬性來聲明,比如:
xmlns:xhtml="http://www.w3.org/1999/xhtml"
其中:
xmlns
是使用專門用來聲明命名空間的保留字,- xhtml是命名空間的前綴
- http://www.w3.org/1999/xhtml (頁面存檔備份,存於網際網路檔案館) 是命名空間的唯一標識符,是一個IRI引用,但通常是一個統一資源標誌符(URI)引用。
命名空間的聲明就是將一個前綴與一個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="",該元素的默認命名空間和它的後代將恢復為「無命名空間」:那就是在任何命名空間裡頭都不被視為前綴名稱。
參考文獻
- ^ Leigh Dodds, News from the trenches, 24 May 2000 [2009-11-12], (原始內容存檔於2021-06-14)
- ^ Dan Connolly, W3C XML Plenary decision on relative URI references in namespace declarations, 11 Sep 2000
- ^ Elliotte Rusty Harold, RDDL Me This: What Does a Namespace URL Locate?, 20 Feb 2001 [2009-11-12], (原始內容存檔於2014-06-20)