XML文件我經(jīng)常使用踢匣,頭部信息一般都是直接粘貼過來戳表,而不知道那些屬性的意義鄙煤。通過查閱資料,我通過自己的理解解釋一下命名空間(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>
元素里的聲明就是本文主要想說的命名空間涧郊。
命名空間包含了我們常用的各種元素以及屬性贯被。
它是由國際化資源標(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ò)誤幌陕,無法正常處理。<br />
-
命名空間可以在元素前面加上前綴汽煮,用以區(qū)分名稱相同的元素搏熄,這樣就可解決上面的問題,命名空間聲明方式為
xmlns:前綴="命名空間"
比如我可以寫xmlns:github="https://github.com/CodingDjz"
暇赤。
其中https://github.com/CodingDjz
就是命名空間標(biāo)識(shí)心例。
命名空間標(biāo)識(shí)可以是任意的字符串。一般是一個(gè)URI鞋囊,這樣可以保持唯一性止后,這樣用它來做區(qū)分才有意義。
聲明一個(gè)命名空間,可以理解為是引入了命名空間內(nèi)的元素译株,就像程序中的import
瓜喇。
github
就是命名空間前綴,它主要是代指后面命名空間的歉糜,不用每次都寫那么長乘寒,用前綴就可以了。
回到table
的問題现恼,在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ì)造成同名沖突問題叉袍。
- 當(dāng)然還可以不寫前綴始锚,直接
xmlns="https://github.com/CodingDjz"
,這表示默認(rèn)命名空間喳逛,直接作用于子元素瞧捌,不用再寫前綴:
了,這種默認(rèn)命名空間一個(gè)文檔只能有一個(gè)润文。
默認(rèn)命名空間和無命名空間概念是不同的姐呐。
-
在
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文件來校驗(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文件沒有使用命名空間。
XSD文件<schema>標(biāo)簽
xsd文件其實(shí)也是xml文件贸弥,它的作用是校驗(yàn)一個(gè)xml文件的格式,dtd文件也是同樣作用海渊,但是xsd功能更加強(qiáng)大绵疲,語法更加優(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
概念社证。
如果沒有定義
targetNamespace
屬性逼龟,就說明此xsd沒有目標(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)簽下一層)的元素和屬性才必須具有命名空間,,其他子元素和屬性可以沒有命名空間修飾(屬于無命名空間)朱浴。
以上就是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 />