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