何謂名稱空間 何謂URI 名稱空間的作用方式 使用名稱空間的注意事項 第六章 XML名稱空間 何謂名稱空間 何謂URI 名稱空間的作用方式 使用名稱空間的注意事項
XML名稱空間 XML名稱空間(Namespaces)在1999年1月14日成為W3C的推薦標準,它的主要功用在解決XML元素或屬性名稱的衝突問題。 名稱衝突主要是導因於在一個XML文件中,同時引用了屬於不同語彙(vocabularies)的元素或屬性名稱所致。
為什麼需要名稱空間 在不使用Namespace的XML文件中,元素和屬性中的名稱,其單一性僅及於文件自身,我們稱它們為區域名稱(loca names)。區 域名稱並不適合在網路環境使用,因為我們很難確保其名稱的單一性。
為什麼需要名稱空間(續) <?xml version="1.0" encoding="UTF-8"?> <!-- edited with XML Spy v3.5 NT (http://www.xmlspy.com) by Redice (ccumis) --> <library> <book> <cover>href='112333'</cover> <title>XML與電子商務</title> <author> <last_name/> <first_name/> <descriptions> <head> <title>html上的title部分</title> </head> <body/> </descriptions> </author> </book> </library>
為什麼需要名稱空間(續) 依上圖為例說明 Description元素的內容是以XHTML格式來設計的。這時候程式處理這個文件,當處理到title元素時,判斷該title元素,究竟是指書名,還是指HTML文件的標題。 不同Application間的相同語彙,就造成了XML processor在處理文件上的混淆。
名稱空間如何解決問題 XML使用URI(Uniform Resource Identifier)的引來作為Namespace,只要將URI的參引加到元素或屬性名稱的前面,就能使名稱具有單一性。 我們稱包含Namespace的名稱為全域名稱(universal name)。 全域名稱能使應用程式很容易的區別來自不同XML Application的語彙。
名稱空間如何解決問題(續) <description> <{http://www.w3.org/TR/xhtml1}head> <{http://www.w3.org/TR/xhtml1}title>Book </ {http://www.w3.org/TR/xhtml1}title> </{http://www.w3.org/TR/xhtml1}head> </description> 屬於HTML 語法的title元素名稱轉換成全域名稱{http://www.w3.org/TR/xhtml1}title,其URI的部分是http://www.w3.org/TR/xhtml1,而區域名稱則是title。
名稱空間如何解決問題(續) XML使用URI的參引來作為名稱空間,只要將URI的參引加到元素或屬性名稱的前面 <library> <book> <cover>href='112333'</cover> <title>XML與電子商務</title> <author> <descriptions> < {http://www.w3.org/TR/xhtml1} head> title>html上的 title部分</ title> </ <body/> </descriptions> </author> </book> </library>
名稱空間如何解決問題(續) 以上所作的,只是概念上的說明。W3C的建議書並不採用這種作法,因為XML 1.0的parser,並不接受這種格式。 我們將使用這種語法來說明XML Namespaces建議書中原本所使用的語法。
名稱空間如何解決問題(續) XML Namespace建議書定義了一種將XML 1.0文件的樹狀結構。 由本屬於后域名稱的元素名稱及屬性名稱,對應到元素名稱及屬性名稱可視為全域名稱的另一種樹狀結構。 其對應所用的概念是採用前置字串。 元素名稱或屬性名稱中包含冒號(:),那對應機制會視冒號之前的字串為前置字串,而視冒號後的字串為區域名稱。
名稱空間如何解決問題(續) <html:hr xmlns:html="http://www.w3.org/TR/xhtml1"/> 可視為對應到: <{http://www.w3.org/TR/xhtml1}hr/> 而屬性名稱也與元素名稱使用同樣的規則 <div html:class="aaa" xmlns:html="http://.www.w3.org/TR/xhtml1">Hello World!</div> 對應到: <div {http://www.w3.org/TR/xhmtl1}class="aaa">Hello World!</div>
何謂URI URI的全名為Uniform Resource Identifiers,是一組由特定語法定義的字串,可用來識別某項資源。 在XML Namespaces之中所用的,卻是URI。而URI可說是URL的超集(superset)。 在URI的規範中,涵蓋了URL(Uniform Resource Locators)及URN(Uniform Resource Names)
為什麼名稱空間中以URI為參引 URI的設計原則具有延伸性 這一點正好跟URI(URN)的設計原則不謀而合。由於XML可以應用在許多領域中,而這些領域的資源定位方式,並不見得能使用現有的URL。 若使用URI,應用程式甚至可以自訂URN的語法來指明特有的資源,在應用上當然是相對的有彈性多了。
為什麼名稱空間中以URI為參引(續) URI概念層次與概念的層次 實務的層次是指URI一定要透過某些方式,指向一個存在的資源;就像Windows的登錄系統一樣,class id在登錄系統內,最後一定會透過系統內,最後一定會透過某些表示路徑的方式,來指到資源實體。 概念的層次是只管命名URI,而不用去管該URI究竟有沒有指向某項資源。
為什麼名稱空間中以URI為參引(續) 在Namespace中的URI不用指向真正的資源實體,URI只需讓應用程式可識別即可。 如果瀏覽器或XML processor並不認得Namespace所參引的URI,那麼應用程式有兩種選擇: 其一是不加以處理 其二是使用Namespace所指向的URI,來取得該其DTD或Schema的定義,再根據這些定義處理XML文件。
宣告及引用名稱空間
宣告及引用名稱空間(續) Xmlns:html=http://www.w3.org/TR/xhmtl1是屬於Namespace的宣告部分 而“html”並非Namespace name,它稱為前置字串(prefix),僅用於Namespace的引用部分,如下: Html:hr 引用Namespace也就是在原來的元素名稱之前,加上Namespace名稱及冒號(:);包含Namespace的元素名稱即為我們先前所的全域名稱,在XML Namespace規格書中稱為修飾名稱(qualified names)。
名稱空間的有效範圍 Namespace的參引僅能用於宣告該Namespace的元素及其子(孫)元素。 <library> <bk:book xmlns:bk=“http://www.w3.org”> <bk:title>…..</bk:title> </bk:book> <bk:description>…</bk:description> -錯誤用法 </library> 原因是description並非是title的子(孫)元素
名稱空間的有效範圍(續) 除非將前置字串以另一個Namespace的宣告重新定義,否則其所參引到的URI(即Namespace name)不會改變 雖然可以這樣做,但卻很容易造成文件處理上的困擾,應避免使用。 <foo:library xmlns:foo="http://www.foo.org"> <foo:book> <foo:description xmlns:foo="http://www.w3.org/TR/xhtml1"> </foo:book> </foo:library>
名稱空間的有效範圍(續) 在一個元素中可以同時宣告多個Namespace 在XML文件不太大的情況下,我們通常將Namespace宣告全部擺在根元素。 <bk:library xmlns:bk="urn:loc:gov:books" xmlns:isbn="urn:ISBN:0-396-36341-6" xmlns:html="http://www.w3.org/TR/xhml1"> <bk:book isbn:number="1568491379"> .... </bk:book> </bk:library>
預設的名稱空間 使用預設的名稱空間,可以不必以前置字串來指定名稱空間 定義預設的名稱空間 以空字串解除預設的名稱空間 <library xmlns=”http://www.w3.org”> </library> 以空字串解除預設的名稱空間 <A xmlns=“http://www.foo.org”> <C xmlns=“ ”> </A>
預設的名稱空間(續) 使用預設的名稱空間,可以不必以前置字串來指定名稱空間 由預設名稱空間與屬性名稱所形成的全域名稱 <A xmlns=“http://www.foo.org”> <B B1=“abcd”> --- <{http://www.foo.org}{B}B1> </A>
使用名稱空間的注意事項 同一元素的屬性名稱必須保持唯一 不管前名稱空間與區域名稱如何指定,最後一定不能造成同一元素中,任意兩屬性有相同的全域名稱。以下文件中的bad元素均不合法: <!--http://www.w3.org is bound to n1 and n2 --> <X xmlns:n1=“http://www.w3.org” xmlns:n2=“http://www.w3.org”> <bad a=“1” a=“2” /> <bad n1:a=“1” n2:a=“2” /> </X>
使用名稱空間的注意事項(續) 注意XML識別字 注意冒號的使用 在宣告Namespace時,前置字串不可以xml為字首來命名 任何元素或屬性的名稱,只能有一個冒號,或不包含冒號