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