文章摘自:https://yq.aliyun.com/articles/40353 http://www.cnblogs.com/zhao1949/p/5652167.html 參照教程:http://www./xml/xml_dtds.html(易百教程) 前部分為原文引用,后部分為個(gè)人項(xiàng)目引例作為補(bǔ)充。 引用開(kāi)始:
相信很多人和我一樣,在編寫Spring或者M(jìn)aven或者其他需要用到XML文檔的程序時(shí),通常都是將這些XML文檔頭拷貝過(guò)來(lái),并沒(méi)有理解其中元素(比如xmlns,xmlns:xsi,xsi:schemaLocation)的真正含義,不知道哪些元素是多余的,也不知道為什么要加那些元素。這樣當(dāng)有時(shí)候網(wǎng)上Copy的XML頭有錯(cuò)的時(shí)候自己卻不知道怎么下手。我也是這樣的,于是今天花了點(diǎn)時(shí)間好好的理解了一下這些元素及其用法,現(xiàn)整理與此,在此謝謝各位前輩的經(jīng)驗(yàn),如有總結(jié)的不對(duì)或者不好的地方,歡迎留言提出各位的寶貴意見(jiàn)。
話不多說(shuō),先來(lái)一段Spring的XML樣本,相信大家都很眼熟: ![]()
這個(gè)文檔中,根元素<beans/>就不用說(shuō)了,接下來(lái)是xmlns。那么什么是xmlns呢?xmlns其實(shí)是XML Namespace的縮寫,可譯為“XML命名空間”,但個(gè)人覺(jué)得,翻譯后的名字反而不好理解,所以我們就叫它為XML Namespace吧。
為什么需要xmlns?考慮這樣兩個(gè)XML文檔:表示HTML表格元素的<table/>: 和描述一張桌子的<table/>: ![]()
假如這兩個(gè) XML 文檔被一起使用,由于兩個(gè)文檔都包含帶有不同內(nèi)容和定義的 <table> 元素,就會(huì)發(fā)生命名沖突。XML 解析器是無(wú)法確定如何處理這類沖突。為了解決上述問(wèn)題,xmlns就產(chǎn)生了。
如何是用xmlns?很簡(jiǎn)單,使用語(yǔ)法: xmlns:namespace-prefix="namespaceURI"。其中namespace-prefix為自定義前綴,只要在這個(gè)XML文檔中保證前綴不重復(fù)即可;namespaceURI是這個(gè)前綴對(duì)應(yīng)的XML Namespace的定義。例如, 這一句定義了一個(gè)http://www./schema/context的Namespace(這和Java類中的包的聲明很相似),并將其和前綴context綁定。所以上面的Spring XML文檔中會(huì)有這么一句: ![]()
這里的<component-scan/>元素就來(lái)自別名為context的XML Namespace,也就是在http://www./schema/context中定義的。 我們還可以將前綴定義為abc: 這樣再使用這個(gè)namespaceURI中的元素時(shí),需要以abc為前綴,例如:<abc:xxx/>。再拿上面的例子解釋怎么使用xmlns:
和:
后者與前者僅僅使用不同前綴,我們?yōu)?<table> 標(biāo)簽添加了一個(gè) xmlns 屬性,這樣就為前綴賦予了一個(gè)與某個(gè)命名空間相關(guān)聯(lián)的限定名稱。此時(shí)再把它們放在一起,XML解析器就不會(huì)報(bào)錯(cuò)了。 注意:當(dāng)xmlns被定義在元素的開(kāi)始標(biāo)簽中(如這里的<f:table/>)時(shí),所有帶有相同前綴的子元素都會(huì)與同一個(gè)Namespace相關(guān)聯(lián)(即<f:table/>里面的<f:name/>和<f:width/>也會(huì)使用url2定義的寫法)。
xmlns和xmlns:xsi有什么不同?xmlns表示默認(rèn)的Namespace。例如Spring XML文檔中的 ![]()
這一句表示該文檔默認(rèn)的XML Namespace為http://www./schema/beans。對(duì)于默認(rèn)的Namespace中的元素,可以不使用前綴。例如Spring XML文檔中的 ![]()
xmlns:xsi表示使用xsi作為前綴的Namespace,當(dāng)然前綴xsi需要在文檔中聲明。
xsi:schemaLocation有何作用?xsi:schemaLocation屬性其實(shí)是Namespace為http://www./2001/XMLSchema-instance里的schemaLocation屬性,正是因?yàn)槲覀円婚_(kāi)始聲明了 這里才寫作xsi:schemaLocation(當(dāng)然一般都使用這個(gè)前綴)。它定義了XML Namespace和對(duì)應(yīng)的XSD(Xml Schema Definition)文檔的位置的關(guān)系。它的值由一個(gè)或多個(gè)URI引用對(duì)組成,兩個(gè)URI之間以空白符分隔(空格和換行均可)。第一個(gè)URI是定義的XML Namespace的值,第二個(gè)URI給出Schema文檔的位置,Schema處理器將從這個(gè)位置讀取Schema文檔,該文檔的targetNamespace必須與第一個(gè)URI相匹配。例如: ![]()
這里表示Namespace為http://www./schema/context的Schema的位置為http://www./schema/context/spring-context.xsd。這里我們可以打開(kāi)這個(gè)Schema的位置,下面是這個(gè)文檔的開(kāi)始部分:
有了上面的說(shuō)明后,再去理解開(kāi)始的Spring XML文檔,一定會(huì)有不一樣的感覺(jué)! ----------------------------------以上均為引用,以本人項(xiàng)目為例對(duì)上面的解釋補(bǔ)充個(gè)人見(jiàn)解,如下--------------------------------------------- 從本人項(xiàng)目中,可以看看相應(yīng)的代碼: 又例如,何時(shí)名字空間何時(shí)可以刪除呢,比如下面的情況: 由此可見(jiàn):一切以 xsi:schemaLocation=“”為準(zhǔn),也就是說(shuō)xsi:schemaLocation包含的部分一定要出現(xiàn)在名字空間中。而實(shí)際上寫的只需要>=xsi:schemaLocation中的內(nèi)容即可,這就是刪除的依據(jù)。 又例,以maven中的pom.xml文件為例: 再例: 最后,以web service中xml的wsdl文件再一次詳細(xì)說(shuō)明: 只不過(guò)這里沒(méi)有 xsi:schemaLocation的說(shuō)法,所以這里的名字空間就不能隨意刪除了 其實(shí),看到這,已經(jīng)領(lǐng)悟很多了。 XML中的文檔聲明類型:dtd 此處參考易百教程:http://www./xml/xml_dtds.html dtd是一種XML的約束,說(shuō)白了就是我定義了dtd文件,下面的xml編寫必須按照我的約束條件來(lái)寫。分為內(nèi)部dtd和外部dtd(系統(tǒng)標(biāo)識(shí)符(SYSTEM)和公共標(biāo)識(shí)符(PUBLIC)) 內(nèi)部dtd: 外部dtd:就是這個(gè)dtd文件是外部引用的,和css文件的內(nèi)部,外部一個(gè)意思 所以SYSTEM和PUBLIC這種關(guān)鍵字就是引入外部dtd文件的。 以我的項(xiàng)目經(jīng)歷為例,一個(gè)例子如下:
|
|
來(lái)自: 一本正經(jīng)地胡鬧 > 《待分類》