spring中xml檔案的xmlns、xmlns:xsi和xsi:schemaLocation
相信很多人和我一樣,在編寫Spring或者Maven或者其他需要用到XML文件的程式時,通常都是將這些XML文件頭拷貝過來,並沒有理解其中元素(比如xmlns,xmlns:xsi,xsi:schemaLocation)的真正含義,不知道哪些元素是多餘的,也不知道為什麼要加那些元素。這樣當有時候網上Copy的XML頭有錯的時候自己卻不知道怎麼下手。我也是這樣的,於是今天花了點時間好好的理解了一下這些元素及其用法,現整理與此,在此謝謝各位前輩的經驗,如有總結的不對或者不好的地方,歡迎留言提出各位的寶貴意見。
話不多說,先來一段Spring的XML樣本,相信大家都很眼熟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
這個文件中,根元素<beans/>就不用說了,接下來是xmlns。那麼什麼是xmlns呢?xmlns其實是XML Namespace的縮寫,可譯為“XML名稱空間”,但個人覺得,翻譯後的名字反而不好理解,所以我們就叫它為XML Namespace吧。
為什麼需要xmlns?
考慮這樣兩個XML文件:表示HTML表格元素的<table/>:
1 2 3 4 5 6 |
|
和描述一張桌子的<table/>:
1 2 3 4 5 |
|
假如這兩個 XML 文件被一起使用,由於兩個文件都包含帶有不同內容和定義的 <table> 元素,就會發生命名衝突。XML 解析器是無法確定如何處理這類衝突。為了解決上述問題,xmlns就產生了。
如何是用xmlns?
很簡單,使用語法: xmlns:namespace-prefix="namespaceURI"。其中namespace-prefix為自定義字首,只要在這個XML文件中保證字首不重複即可;namespaceURI是這個字首對應的XML Namespace的定義。例如,
1 |
|
這一句定義了一個http://www.springframwork.org/schema/context的Namespace(這和Java類中的包的宣告很相似),並將其和字首context繫結。所以上面的Spring XML文件中會有這麼一句:
1 |
|
這裡的<component-scan/>元素就來自別名為context的XML Namespace,也就是在http://www.springframework.org/schema/context中定義的。
我們還可以將字首定義為abc:
1 |
|
這樣再使用這個namespaceURI中的元素時,需要以abc為字首,例如:<abc:xxx/>。再拿上面的例子解釋怎麼使用xmlns:
1 2 3 4 5 6 7 |
|
和:
1 2 3 4 5 6 |
|
後者與前者僅僅使用不同字首,我們為 <table> 標籤添加了一個 xmlns 屬性,這樣就為字首賦予了一個與某個名稱空間相關聯的限定名稱。此時再把它們放在一起,XML解析器就不會報錯了。
注意:當xmlns被定義在元素的開始標籤中(如這裡的<f:table/>)時,所有帶有相同字首的子元素都會與同一個Namespace相關聯(即<f:table/>裡面的<f:name/>和<f:width/>也會使用url2定義的寫法)。
xmlns和xmlns:xsi有什麼不同?
xmlns表示預設的Namespace。例如Spring XML文件中的
1 |
|
這一句表示該文件預設的XML Namespace為http://www.springframwork.org/schema/beans。對於預設的Namespace中的元素,可以不使用字首。例如Spring XML文件中的
1 2 3 |
|
xmlns:xsi表示使用xsi作為字首的Namespace,當然字首xsi需要在文件中宣告。
xsi:schemaLocation有何作用?
xsi:schemaLocation屬性其實是Namespace為http://www.w3.org/2001/XMLSchema-instance裡的schemaLocation屬性,正是因為我們一開始聲明瞭
1 |
|
這裡才寫作xsi:schemaLocation(當然一般都使用這個字首)。它定義了XML Namespace和對應的XSD(Xml Schema Definition)文件的位置的關係。它的值由一個或多個URI引用對組成,兩個URI之間以空白符分隔(空格和換行均可)。第一個URI是定義的XML Namespace的值,第二個URI給出Schema文件的位置,Schema處理器將從這個位置讀取Schema文件,該文件的targetNamespace必須與第一個URI相匹配。例如:
1 2 |
|
這裡表示Namespace為http://www.springframework.org/schema/context的Schema的位置為http://www.springframework.org/schema/context/spring-context.xsd。這裡我們可以開啟這個Schema的位置,下面是這個文件的開始部分:
1 2 3 4 5 6 7 8 9 |
|