Spring的xml文件詳解


spring的xml配置文件頭:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans            
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context                                                                             
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
                       
                        ...<!--中間xml文件部分-->.....
    </beans>

一直在復制黏貼,但是不知道作用是什么,不理解的話常出錯。。。

xmlns和命名空間

首先,介紹一下xmlns的作用,如下所示,一個 xml 文檔中如果包含如下兩種定義不同, 但是名稱相同的元素, xml 解析器是無法解析的, 因為它不能確定當你調用document.getElementsByTagName("book") 時應該返回哪個元素。

<!-- 這里的 table 元素描述的是一個表格-->
<table>
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>
<!-- 這里的 table 元素描述的是一個家居桌子-->
<table>
   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
</table>

這時候可以通過在名稱增加前綴解決這個問題

<!-- 這里的 table 元素描述的是一個表格-->
<h:table>  <!--添加了前綴 h -->
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>
<!-- 這里的 table 元素描述的是一個表格-->
<f:table> <!--添加了前綴 f -->
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

由此,引入一個概念 命名空間,通過增加前綴表示不同的那是不同命名空間下的table,從而解決了矛盾,但是不同的人都有自己創建的不同的命名空間來描述同樣的東西,不利於xml文件信息的解析,比如說,同樣都是水果,可以從顏色和香味不同角度來定義成如下兩種形式:

<!--按照水果香味來定義-->
<perfume:fruit>
      <name>....</name>
      <perfume>.....</perfume>
</perfume:fruit>

<!--按照水果顏色來定義-->
<color:fruit>
      <name>....</name>
      <color>....</color>
</color:fruit>

為此,w3c(萬維網聯盟)對於一些類型,定義了對應的命名空間和這些類型的標准,xml解釋器碰到這些類型的時候就會通過這些標准去解析這類型的標簽,為了確保命名空間的唯一,所以不同的命名空間的通常使用URL作為被識別的id,如下例子:

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

這句話的作用是當前引入了一個叫做xsi的命名空間,xsi可以在接下來要使用該命名空間時所使用的,如下:

<xsi:schemaLocation="...... ......">

http://www.w3.org/2001/XMLSchema-instance這個很長的字符串,則是xsi這個名稱空間被xml解釋器內部所識別的時候所真正使用的id,但也本身只是被當做一個字符串名字去處理,xml解釋器根據這個id去獲取它對應的標准,從而知道這個命名空間定義有什么樣的標簽(xml解釋器自帶有一些通用的命名空間的標准),這個字符串雖然看起來是URL,但是和對應的網頁上的信息沒有關系,只是用來提供命名空間唯一性的作用,網址有時可以被打開,上面會有關於該命名空間的信息。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"

所以,spring配置文件中這三句話分別表示,引入了三個命名空間。
其中第一個xmlns后面沒有空間名的,表示引入了一個默認的名稱空間,下文中不使用命名空間前綴的都默認使用這個命名空間,這個默認的命名空間,其真正的id是"http://www.springframework.org/schema/beans"。
引入的第二個命名空間叫做xsi,其真正的id是"http://www.w3.org/2001/XMLSchema-instance"
引入的第三個命名空間叫做context,其真正的id是"http://www.springframework.org/schema/context"

xsi:schemaLocation

    xsi:schemaLocation="http://www.springframework.org/schema/beans            
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context                                                                             
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd"

在最后可以看到xsi:schemaLocation,這句話的意思表示使用命名空間xsi下的schemaLocatioin,設置了它對應的值為后面很多很多的URL,schemaLocation中存儲的值每兩個為一組,第一個代表命名空間,第二個代表該命名空間的標准的文件位置,如下所示,這句話就是說明命名空間http://www.springframework.org/schema/beans的標准文件是http://www.springframework.org/schema/beans/spring-beans-3.0.xsd*

    xsi:schemaLocation="http://www.springframework.org/schema/beans            
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

因為xml解釋器不一定含有所有命名空間的標准,通過這樣設置就可以告訴xml解釋器不同命名空間的對應的標准是什么了,而這也是xsi這個命名空間的作用,要用到其schemaLocation。

最后,對應一般的xml解釋器的工作流程中,xml解釋器識別到有“http://www.w3.org/2001/XMLSchema-instance"這個通用的名稱空間后,明白知道要引入一些不同命名空間,就會從其schemaLocation中獲取不同命名空間和其對應的標准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM