天天看點

XML知識點滴(10)

XML知識點滴(10)

(引用文章,版權歸作者,如需删除請聯系我)

XML名稱空間

n         一個XML文檔中可以包含許多元素與屬性,當我們使用其他人的XML文檔,或者在文檔中使用多個DTD檔案時,就有可能碰到名稱相同的元素,而這些名稱相同的元素就可能代表了完全不同的含義。比如:title可以用于表示标題,也可以用于表示某個人的頭銜;table可以表示表格,也可以表示桌子。當這些具有相同名稱不同含義的元素混合到一個文檔中時,就會造成了解和處理上的混亂。為了解決這個問題,就要用到W3C釋出的另一個推薦标準——XML名稱空間。

n         可以在http://www.w3.org/TR/REC-xml-names/上檢視XML名稱空間規範的詳細内容。

聲明名稱空間

n         名稱空間通過使用一系列的保留屬性來聲明,這種屬性的名字必須是以xmlns或以xmlns:作為字首。與其他任何XML屬性一樣,這些屬性可以直接或以預設的方式給出。

n         XML名稱中的冒号“:”在XML命名中有特殊的含義。冒号前面的部分稱為元素的“字首”(Prefix),後面的部分稱為元素的“本地名”(Local name)。字首、冒号和本地名合起來稱為元素的“限定名”(Qualified name)。字首和特定的“統一資源辨別符”(URI)相聯系。具有該字首的元素或屬性稱為屬于該字首對應URI所表示的名稱空間。

n         名稱空間的聲明有兩種形式:

Ø         第一種形式

              <元素名 xmlns:prefixname=”URI”>

元素名是指你在哪一個元素上聲明名稱空間,在這個元素上聲明的名稱空間适用于聲明它的元素和屬性,以及該元素内容中的所有元素及其屬性。

xmlns:prefixname作為該元素的屬性名,屬性的值是一個URI引用,是辨別該名稱空間的名稱空間名字。其中prefixname給出名稱空間字首的名字,該字首用于将元素及屬性的名字與URI關聯在一起。要注意的是,在這樣的聲明中,名稱空間的名稱不能為空(””)。如果有兩個URI,其組成字元完全相同,可以認為它們辨別了同一個名稱空間。

來自于XML名稱空間的名字可以作為限定名(qualified names)出現,限定名包括了一個以冒号(:)分隔的名稱空間字首和一個本地部分(local part)。映射到URI引用的名稱空間字首選擇了一個名稱空間。

              例如:

                     <hr xmlns:hr=”http://localhost/hr”>

                     <hr:employee>

       名稱空間字首可以是不包含冒号的任何合法的XML名稱。

在聲明名稱空間時,有兩個字首是不允許使用的,它們是xml和xmlns。xml字首隻能用于XML1.0規範中定義的xml:space和xml:lang屬性,字首xml被定義為與名稱空間名字http://www.w3.org/XML/1998/namespace綁定。字首xmlns僅僅用于聲明名稱空間的綁定,它被定義為與名稱空間名字http://www.w3.org/2000/xmlns綁定。

名稱空間推薦标準中指出,在名稱空間聲明中,使用相對URI引用已經被廢棄了(不贊成使用)。

Ø         第二種形式

              <元素名 xmlns=”URI”>

       這種聲明形式沒有給出名稱空間的字首名,URI所辨別的是預設的名稱空間。在這樣的 預設聲明中,屬性可以為空(””)。例如:

              <hr xmlns=”http://localhost/hr”>

表明聲明了一個預設的名稱空間,hr元素及其内容中所有的沒有字首的元素都屬于http://localhost/hr所辨別的名稱空間,除非被hr元素内容中其他的預設名稱空間聲明所覆寫。注意:在聲明名稱空間時,選擇的URI不需要指向實際的内容,在URI所辨別的位置上,可以不存在任何東西。在名稱空間聲明中的URI隻是形式上的辨別符,其唯一的目的是提供一個唯一的名字。

名稱空間在元素和屬性中的運用

n         在具有很多元素(這些元素都在同一個名稱空間中)的文檔中,給每個元素名稱都添加一個字首将是一件煩瑣的事情。為此,我們可以使用沒有字首名的xmlns屬性将預設的名稱空間附加給元素及其子元素,元素本身及其子元素都被認為是在預設的名稱空間中,除非它們有明确的字首。

n         預設名稱空間中的URI可以設為空字元串,這樣的話,在它的聲明範圍内,沒有字首的元素将被認為不存在于任何的名稱空間中,這和沒有聲明預設名稱空間是一樣的。

n         一個屬性要想在某個名稱空間中,必須給該屬性加上名稱空間的字首,沒有字首的屬性不在任何的名稱空間中(包括預設的名稱空間)。即使擁有屬性的元素在某個名稱空間中,沒有字首的屬性仍然不在該名稱空間或任何其他的名稱空間中。

n         在XML文檔中,沒有任何一個标簽可以包含兩個相同的屬性,所謂相同有兩種情況,一種是屬性的名字完全相同,另一種是屬性限定名中的本地部分完全相同,而不同的字首綁定到了相同的名稱空間名字。例如:

       <?xml version=”1.0” encoding=”gb2312”?>

       <x xmlns:n1=”http://www.w3.org” xmlns: n2=”http://www.w3.org”>

       <!—錯誤,兩個屬性的名字相同-->

       <bad a=”1” a=”2”/>

       <!—錯誤,字首n1和n2綁定的是同一個名稱空間名字,而本地部分也完全相 同-->

       <bad n1:a=”1” n2:a=”2”/>

       </x>

       <?xml version=”1.0” encoding=”gb2312”>

       <x xmlns:n1=” http://www.w3.org” xmlns=” http://www.w3.org”>

       <!—正确,屬性名不同-->

       <good a=”1” b=”2”/>

       <good a=”1” n1=”2”/>

       </x>

名稱空間和DTD

n         DTD和名稱空間并不相關,當XML處理器在驗證文檔的有效性時,根本不管元素字首的含義,隻是按照DTD的規範對文檔進行有效性驗證。

n         我們聲明名稱空間時,使用了xmlns或xmlns:prefixname屬性,而在驗證時,會發現在DTD中沒有聲明該屬性,當然驗證就會失敗;另外,如果在DTD中聲明的是book元素,而在文檔中使用的是bks:book元素,則文檔也是無效的。

n         為了讓使用名稱空間的文檔有效,我們必須在DTD中像聲明其他屬性一樣聲明xmlns或xmlns:prefixname屬性,此外,還需要重寫說有帶有字首的元素和屬性的聲明。例如:

<?xml version="1.0" encoding="gb2312"?>

<!--沒有使用名稱空間的文檔-->

<!DOCTYPE book[

     <!ELEMENT book (title,author)>

     <!ELEMENT title (#PCDATA)>

     <!ELEMENT author (#PCDATA)>

]>

<book>

     <title>JSP深入程式設計</title>

     <author>張三</author>

</book>

<?xml version="1.0" encoding="gb2312"?>

<!--應用了名稱空間後,要重寫DTD-->

<!DOCTYPE book[

     <!ELEMENT book (bk:title, bk:author)>

     <!ATTLIST book xmlns:bk CDATA #REQUIRED>

     <!ELEMENT bk:title (#PCDATA)>

     <!ELEMENT bk:author (#PCDATA)>

]>

<book xmlns:bk="http://localhost/bk">

     <bk:title>JSP深入程式設計</bk:title>

     <bk:author>張三</bk:author>

</book>

預設名稱空間隻要在DTD對xmlns屬性進行聲明就可以了。

繼續閱讀