最近繼續(xù)看Struts哨鸭,在看struts.xml配置的時(shí)候看到這個(gè):
[html]view plaincopy
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
想起了自己在以前的博客中有人問到這個(gè)問題判莉,然后自己對(duì)XML也比較陌生,所以系統(tǒng)性地學(xué)了一下骚腥,把基本的屬性,XML DOM(其實(shí)和HTML DOM類似),DTD嗜侮,XML Schema焊虏,xmlns理了一次淡喜。
類似這種技術(shù)知識(shí)的,直接谷歌就好诵闭,這樣會(huì)省很多時(shí)間炼团。
先是從StackOverFlow看到:http://stackoverflow.com/questions/1181888/what-does-xmlns-in-xml-mean
問:我在xml文件中看到這句話,xmlns疏尿,這是什么呢瘟芝?
[html]view plaincopy
xmlns:android="http://schemas.android.com/apk/res/android"
答:它定義了一個(gè)XML命名空間。
在你的例子中褥琐,命名空間前綴是android锌俱,命名空間的uri為
[html]view plaincopy
http://schemas.android.com/apk/res/android
在文檔中,你可以看到這樣的元素敌呈。
這樣認(rèn)為贸宏,命名空間前綴就是一個(gè)變量,以簡短的名字表示整個(gè)命名空間uri磕洪。
和這樣寫是等價(jià)的吭练。XML解析器讀取的時(shí)候就是這樣讀取的。
參考:http://www.sitepoint.com/xml-namespaces-explained/#
參考的文章寫得比較好析显,w3c在這部分講得過于簡單鲫咽,所以還是翻譯一下這篇文章。
XML Namespaces Explained
為什么我們需要XML命名空間?
這里有存在命名空間的兩個(gè)基本需要:
1分尸、消除兩個(gè)剛好同名的元素的歧義姊舵。
2、將共同idea的元素分組在一起寓落。
這些描述有點(diǎn)模糊括丁,直接看例子:
消除兩個(gè)剛好同名的元素的歧義
考慮一下:
* 在(x)html文件中有table元素,同時(shí)XSL-FO(現(xiàn)在稱為XSL伶选,作用可以類比CSS對(duì)Html的作用)里面也有同名的元素史飞。
* a,title和style都是(x)html和SVG(SVG 是使用 XML 來描述二維圖形和繪圖程序的語言)的元素仰税。
好了构资,那你怎么區(qū)分SVG的title和HTML的title的不同呢?
將共同idea的元素分組在一起
在(X)html文件中陨簇,table吐绵,style和a元素由所需求的特殊規(guī)則管理,一些可能包含河绽,一些可能不包含己单。
定義所需的規(guī)則都應(yīng)該包括在同一個(gè)地方。
例如耙饰,我以XML為基礎(chǔ)的數(shù)據(jù)要有驗(yàn)證規(guī)則纹笼,我要的是:
* 在同一個(gè)地方定義這些規(guī)則。
* 將這些特殊的規(guī)則和其他我(或者是別人)定義的規(guī)則集合區(qū)分苟跪。
命名空間是什么廷痘?
命名空間是唯一的URI。
這種格式的好處是任何傳輸XML的人件已,可以假裝成是拿到了域名(the bit after the http://, but before the next / 這句不知道怎么翻譯笋额,希望有人指出,謝謝)篷扩,但是依靠別人的域名并不好(特別是他們不知道你這樣做)兄猩。
在XML文檔里面,URI是和前綴聯(lián)系在一起的瞻惋,每個(gè)元素用到的前綴表示著這個(gè)元素屬于哪個(gè)命名空間厦滤。例如:
[html]view plaincopy
rdf:description
xsl:template
zblsa:data
這些例子中:
* 冒號(hào)前面部分是前綴
* 冒號(hào)后面部分是本地部分
* 任何有前綴的元素是符合規(guī)范的名字
* 沒有前綴的元素是不符合規(guī)范的名字
我如何是用命名空間援岩?
使用命名空間歼狼,首先將命名空間和URI聯(lián)系。
[html]view plaincopy
.
foo定義為元素標(biāo)簽命名空間的前綴享怀。xmlns作為前綴和該屬性連接羽峰,就像在命令“將這些字母和URI連接”。如一個(gè)不規(guī)范的文檔有兩個(gè)完全一樣的屬性,冒號(hào)后面部分能夠阻止相同的前綴同時(shí)被定義兩次梅屉。
定義一個(gè)命名空間前綴
這里有個(gè)定義一個(gè)命名空間前綴的例子:
[html]view plaincopy
An?example?document
a?simple?document
Another?element
所有的元素都在里面值纱,命名空間前綴foo是和http://me.com/namespaces/foofoo聯(lián)系在一起的。
在同一命名空間定義多個(gè)前綴
不同的前綴代表不同的命名空間是可以的坯汤,如下:
[objc]view plaincopy
An?example?document
a?simple?document
Another?element
不同的命名空間定義相同的前綴
不同的命名空間定義相同的前綴也是可以的(不過不推薦)虐唠,取決于上下文:
[html]view plaincopy
A?really?bad?idea
A?really?bad?idea
Hello?World
筆記:這不是一個(gè)好想法!
多個(gè)命名空間
如果你使用多個(gè)命名空間惰聂,那你無疑需要在同時(shí)使用多個(gè)命名空間——所以你該如何在同一時(shí)間聲明多個(gè)命名空間疆偿。
你需要做的就是使用多個(gè)xmlns聲明,就像這樣:
[html]view plaincopy
xmlns:bar="http://me.com/namespaces/foobar"
>
An?example?document
a?simple?document
Another?element
默認(rèn)的命名空間
Q:使用任何命名空間時(shí)搓幌,所有元素都需要存在一個(gè)命名空間里面嗎杆故。
A:是的,但是這樣不會(huì)有問題溉愁。
定義一個(gè)命名空間但是沒有和前綴聯(lián)系是允許的——在上面的例子中他們是不規(guī)范的名字处铛。
這就是xhtml的重要性,作為這種語言的一種需求拐揭,xhtml不會(huì)取代html——html也不認(rèn)識(shí)前綴們撤蟆。
定義默認(rèn)的命名空間,不用前綴堂污,直接將xmlns分配就可以了:
[html]view plaincopy
舉例:
[html]view plaincopy
xmlns:bar="http://me.com/namespaces/foobar"
>
An?example?document
a?simple?document
Another?element
屬性和命名空間和我應(yīng)該在命名空間URI最后放什么就不翻譯了枫疆。
再回到問題:
[html]view plaincopy
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
再結(jié)合W3C的教程:
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文檔的結(jié)構(gòu)敷鸦。
XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition息楔,XSD)。
而DTD是扒披,DTD(文檔類型定義)的作用是定義 XML 文檔的合法構(gòu)建模塊值依。
歸根到底,命名空間的出現(xiàn)就是為了區(qū)分相同名字的元素他們有不同的含義碟案。
通過命名空間就能區(qū)分究竟是你的還是我的元素:
xmlns:you= http://you 和 xmlns:me=http://me 這兩個(gè)不同的命名空間前綴愿险。
如果是xmlns=uri,表示的是文檔默認(rèn)的命名空間价说。
現(xiàn)在來看辆亏,W3C講得還是對(duì)的:
[html]view plaincopy
xmlns="http://java.sun.com/xml/ns/j2ee"
告訴schema認(rèn)證器,XML中所有元素的命名空間都是http://java.sun.com/xml/ns/j2ee
[html]view plaincopy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi為前綴的命名空間鳖目。結(jié)合上面的例子扮叨,xsi:schemaLocation就是http://www.w3.org/2001/XMLSchema-instance/xsi:schemaLocation。
[html]view plaincopy
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
發(fā)現(xiàn)沒有领迈,有兩個(gè)值彻磁,第一個(gè)為命名空間的值碍沐,第二個(gè)值為該命名空間使用的xml schema的位置,而由上面可知道:XML Schema 描述 XML 文檔的結(jié)構(gòu)衷蜓。
最后這個(gè)schema后面看書又補(bǔ)充了一些完整的內(nèi)容進(jìn)去累提。
引入xml schema 文檔
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
名稱空間的不同可以有兩種同名但不同的約束模式存在,
第一句并不能聲明schema所在的位置磁浇,只知道這是名稱空間的uri斋陪。
schemaLocation在公認(rèn)的名稱空間中聲明,所以置吓,前綴用到的時(shí)候鳍贾,要加前綴xsi,同時(shí)聲明xsi對(duì)應(yīng)的名稱空間交洗。
schemaLocation屬性設(shè)置有兩個(gè)部分骑科,名稱空間 空格 加上schema文件所在的位置。
不使用名稱空間引入schema文檔的話构拳,只能引入一個(gè)咆爽。