更新時間:2021-06-22 來源:黑馬程序員 瀏覽量:
一個XML文檔可以引入多個約束文檔,但是,由于約束文檔中的元素或屬性都是自定義的,因此,在XML文檔中,極有可能出現代表不同含義的同名元素或屬性,導致名稱發生沖突。為此,在XML文檔中,提供了名稱空間,它可以唯一標識一個元素或者屬性。這就好比打車去小營,由于北京有兩個地方叫小營,為了避免司機走錯,我們總會說去“去亞運村的小營”或者“去清河的小營”。這時的亞運村或者清河就相當于一個名稱空間。
在使用名稱空間時,首先必須聲明名稱空間。名稱空間的聲明就是在XML實例文檔中為某個模式文檔的名稱空間指定一個臨時的簡寫名稱,它通過一系列的保留屬性來聲明,這種屬性的名字必須是以“xmlns”或者以“xmlns:”作為前綴。它與其它任何XML屬性一樣,都可以通過直接或者使用默認的方式給出。名稱空間聲明的語法格式如下所示:
<元素名 xmlns:prefixname="URI">在上述語法格式中,元素名指的是在哪一個元素上聲明名稱空間,在這個元素上聲明的名稱空間適用于聲明它的元素和屬性,以及該元素中嵌套的所有元素及其屬性。xmlns:prefixname指的是該元素的屬性名,它所對應的值是一個URI引用,用來標識該名稱空間的名稱。需要注意的是,如果有兩個URI并且其組成的字符完全相同,就可以認為它們標識的是同一個名稱空間。
了解了名稱空間的聲明方式,接下來,通過一個案例來學習,如例1所示。
例1 book.xml
<?xml version="1.0" encoding="UTF-8"?> <it315:書架 xmlns:it315="http://www.it315.org/xmlbook/schema"> <it315:書> <it315:書名>JavaScript網頁開發</it315:書名> <it315:作者>張孝祥</it315:作者> <it315:售價>28.00元</it315:售價> </it315:書> </it315:書架>
在例1中,it315被作為多個元素名稱的前綴部分,必須通過名稱空間聲明將它關聯到唯一標識某個名稱空間的URI上,xmlns:it315="http://www.it315.org/xmlbook/schema"語句就是將前綴名it315關聯到名稱空間"http://www.it315.org/xmlbook/schema"上。由此可見,名稱空間的應用就是將一個前綴(如it315)綁定到代表某個名稱空間的URI(如http://www.it315.org/xmlbook/schema)上,然后將前綴添加到元素名稱的前面(例如,it315:書)來說明該元素屬于哪個模式文檔。
需要注意的是,在聲明名稱空間時,有兩個前綴是不允許使用的,它們是xml和xmlns。xml前綴被定義為與名稱空間名字http://www.w3.org/XML/1998/namespace綁定,只能用于XML1.0規范中定義的xml:space和xml:lang屬性。前綴xmlns僅僅用于聲明名稱空間的綁定,它被定義為與名稱空間名字http://www.w3.org/2000/xmlns綁定。
默認名稱空間
如果一個文檔有很多元素,并且這些元素都在同一個名稱空間,這時,給每個元素名稱都添加一個前綴將是一件非常繁瑣的事情。這時可以使用默認的名稱空間,默認名稱空間聲明的語法格式如下所示:
<元素名 xmls="URI">
在上面的語法格式中,URI所標識的是默認的名稱空間。以這種方式聲明的空間名稱將作為其作用域內所有元素的默認名稱空間。接下來,對例1進行修改,將book.xml改為默認名稱空間的形式,如例2所示。
例2 book.xml
<?xml version="1.0"encoding="UTF-8"?> <書架 xmlns="http://www.it315.org/xmlbook/schema"> <書> <書名>JavaScript網頁開發</書名> <作者>張孝祥</作者> <售價>28.00元</售價> </書> </書架>
在例2中,雖然“書架”、“書”、“書名”、“作者”、“售價”等元素名稱前面沒有前綴,但是由于"http://www.it315.org/xmlbook/schema"被設置成了默認的名稱空間,所以,它們仍然是"http://www.it315.org/xmlbook/schema"這個URI所標識的名稱空間中的元素。雖然使用默認名稱空間會減少一些書寫工作量,而使用帶前綴的非默認名稱空間會增加一些書寫工作量,但合理地命名前綴卻可以為人們瀏覽 XML文檔時提供便利,例如,book:title很容易讓人聯想到title是book 詞匯表中定義的元素。