XML文件我經(jīng)常使用,頭部信息一般都是直接粘貼過(guò)來(lái),而不知道那些屬性的意義。通過(guò)查閱資料,我通過(guò)自己的理解解釋一下命名空間(namespace)概念,以及xsd文件核心標(biāo)簽<schema>的用法。
XML文件命名空間
觀察下面這個(gè)xml文件(spring框架文件頭):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
第一行
<?xml version="1.0" encoding="UTF-8"?>
是xml聲明,用于標(biāo)識(shí)改xml文件的版本號(hào)和編碼方式,其中version
是必須存在的,編碼屬性可以省略。<bean>
元素里的聲明就是本文主要想說(shuō)的命名空間。
命名空間包含了我們常用的各種元素以及屬性。
它是由國(guó)際化資源標(biāo)識(shí)符 (IRI) 標(biāo)識(shí)的 XML 元素和屬性集合。
假設(shè)有如下情況:
有個(gè)table.xml
文件,在表格中記載著歌詞:
<table>
<tr>
<td>I have a apple</td>
<td>I have a pen</td>
<td>e..</td>
<td>apple-pen</td>
</tr>
</table>
還有另外一個(gè)table.xml
文件,記錄著一張桌子的信息:
<table>
<name>PC Table</name>
<width>100</width>
<length>150</length>
</table>
如果我們工作需要同時(shí)使用這兩個(gè)xml文件,這樣就會(huì)出現(xiàn)2個(gè)<table>
元素,必然會(huì)造成解析錯(cuò)誤,無(wú)法正常處理。<br />
-
命名空間可以在元素前面加上前綴,用以區(qū)分名稱相同的元素,這樣就可解決上面的問(wèn)題,命名空間聲明方式為
xmlns:前綴="命名空間"
比如我可以寫xmlns:github="https://github.com/CodingDjz"
。
其中https://github.com/CodingDjz
就是命名空間標(biāo)識(shí)。
命名空間標(biāo)識(shí)可以是任意的字符串。一般是一個(gè)URI,這樣可以保持唯一性,這樣用它來(lái)做區(qū)分才有意義。
聲明一個(gè)命名空間,可以理解為是引入了命名空間內(nèi)的元素,就像程序中的import
。
github
就是命名空間前綴,它主要是代指后面命名空間的,不用每次都寫那么長(zhǎng),用前綴就可以了。
回到table
的問(wèn)題,在xml文件中聲明了命名空間后,可以寫成如下形式
<s:table xmlns:s="www.song.com">
<s:tr>
<s:td>I have a apple</s:td>
<s:td>I have a pen</s:td>
<s:td>e..</s:td>
<s:td>apple-pen</s:td>
</s:tr>
</s:table>
以及:
<w:table xmlns:w="www.wood.com">
<w:tr>
<w:td>I have a apple</w:td>
<w:td>I have a pen</w:td>
<w:td>e..</w:td>
<w:td>apple-pen</w:td>
</w:tr>
</w:table>
這樣就對(duì)table
以及其子元素進(jìn)行了區(qū)分,不會(huì)造成同名沖突問(wèn)題。
- 當(dāng)然還可以不寫前綴,直接
xmlns="https://github.com/CodingDjz"
,這表示默認(rèn)命名空間,直接作用于子元素,不用再寫前綴:
了,這種默認(rèn)命名空間一個(gè)文檔只能有一個(gè)。
默認(rèn)命名空間和無(wú)命名空間概念是不同的。
-
在
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""
行,xsi
是XML Schema Instance
的縮寫,也可以自己起別的前綴名(不推薦自己亂起名字,使用約定俗成的前綴可以使xml文件結(jié)構(gòu)更加清晰)。
這是一個(gè)特殊的命名空間,它已經(jīng)定義好了4個(gè)標(biāo)簽分別是xsi:type
,xsi:nil
,xsi:schemaLocation
,xsi:noNamespaceSchemaLocation
,這幾個(gè)屬性只有聲明了xsi
命名空間后才能使用。xsi:schemaLocation
:這個(gè)標(biāo)簽的作用是引用xsd文件來(lái)校驗(yàn)自己的格式,其引用值是一對(duì)url,用空格分開。
比如文首例子中xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd",
空格前是xsd
文件的目標(biāo)命名空間,空格后是xsd
文件的所在物理位置。(xsd文件后面會(huì)介紹)xsi:noNamespaceSchemaLocation
:和第一點(diǎn)作用一樣,區(qū)別就是這個(gè)不需要命名空間,因?yàn)橛械?code>xsd文件沒(méi)有使用命名空間。
XSD文件<schema>標(biāo)簽
xsd文件其實(shí)也是xml文件,它的作用是校驗(yàn)一個(gè)xml文件的格式,dtd文件也是同樣作用,但是xsd功能更加強(qiáng)大,語(yǔ)法更加優(yōu)雅。
這是一個(gè)<schema>標(biāo)簽,它是xsd的核心標(biāo)簽:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.library.com"
targetNamespace="http://www.library.com"
elementFormDefault="qualified">
attributeFormDefault="unqualified">
......
</schema>
-
xmlns="http://www.w3.org/2001/XMLSchema"
行,根據(jù)前面講的,我們知道這是一個(gè)默認(rèn)命名空間。
因?yàn)閤sd文件也是xml文件,也是由元素,屬性組成的,所以這行就是聲明xsd文件需要的元素及屬性是定義在"http://www.w3.org/2001/XMLSchema"
這個(gè)命名空間里的。
這個(gè)命名空間是已經(jīng)被W3C保留定義好的,用戶不要去更改它。
- 前面提到
xsi:schemaLocation
屬性,其中用到了xsd的目標(biāo)命名空間(targetNamespace)屬性,也就是targetNamespace="http://www.library.com"
行。它的作用是把我們自己寫的xsd元素及屬性保存到targetNamespace
所聲明的空間里,也就是xsi:schemaLocation
屬性所要引用的地址,這樣就可以完成校驗(yàn)功能,有點(diǎn)像我們程序中package
概念。
如果沒(méi)有定義
targetNamespace
屬性,就說(shuō)明此xsd沒(méi)有目標(biāo)命名空間,那么在xml引用時(shí)使用xsi:schemaLocation
即可。
-
elementFormDefault="qualified">
和
attributeFormDefault="unqualified">
功能相似。
在xsd我們可以對(duì)元素(element)和屬性(attribute)進(jìn)行"限定",能夠使xsd文件的配置更加靈活。他們都有qualified
和unqualified
兩個(gè)值。
如果選擇qualified
,那我們xsd文件中中的所有元素和屬性都必須有一個(gè)命名空間。
如果選擇unqualified
,那么只有全局聲明(可以理解為外層元素,<schema>
標(biāo)簽下一層)的元素和屬性才必須具有命名空間,,其他子元素和屬性可以沒(méi)有命名空間修飾(屬于無(wú)命名空間)。
以上就是xml/xsd文件命名空間配置介紹。
參考資料:
- http://stackoverflow.com/questions/34202967/xmlns-xmlnsxsi-and-xsischemalocation<br />
- http://www.w3school.com.cn/xml/xml_namespaces.asp
- http://www.oracle.com/technetwork/cn/articles/srivastava-namespaces-098626-zhs.html
<br /><br />