『XML』XML/XSD命名空間解析

XML文件我經(jīng)常使用,頭部信息一般都是直接粘貼過來,而不知道那些屬性的意義。通過查閱資料,我通過自己的理解解釋一下命名空間(namespace)概念,以及xsd文件核心標簽<schema>的用法。

XML文件命名空間

觀察下面這個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聲明,用于標識改xml文件的版本號和編碼方式,其中version是必須存在的,編碼屬性可以省略。

  • <bean>元素里的聲明就是本文主要想說的命名空間。

命名空間包含了我們常用的各種元素以及屬性。
它是由國際化資源標識符 (IRI) 標識的 XML 元素和屬性集合。

假設(shè)有如下情況:
有個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>

還有另外一個table.xml文件,記錄著一張桌子的信息:

<table>
   <name>PC Table</name>
   <width>100</width>
   <length>150</length>
</table>

如果我們工作需要同時使用這兩個xml文件,這樣就會出現(xiàn)2個<table>元素,必然會造成解析錯誤,無法正常處理。<br />

  • 命名空間可以在元素前面加上前綴,用以區(qū)分名稱相同的元素,這樣就可解決上面的問題,命名空間聲明方式為xmlns:前綴="命名空間"
    比如我可以寫xmlns:github="https://github.com/CodingDjz"。
    其中https://github.com/CodingDjz就是命名空間標識。

命名空間標識可以是任意的字符串。一般是一個URI,這樣可以保持唯一性,這樣用它來做區(qū)分才有意義。
聲明一個命名空間,可以理解為是引入了命名空間內(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>

這樣就對table以及其子元素進行了區(qū)分,不會造成同名沖突問題。

  • 當(dāng)然還可以不寫前綴,直接xmlns="https://github.com/CodingDjz",這表示默認命名空間,直接作用于子元素,不用再寫前綴:了,這種默認命名空間一個文檔只能有一個。

默認命名空間和無命名空間概念是不同的。

  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""行,xsiXML Schema Instance的縮寫,也可以自己起別的前綴名(不推薦自己亂起名字,使用約定俗成的前綴可以使xml文件結(jié)構(gòu)更加清晰)。
    這是一個特殊的命名空間,它已經(jīng)定義好了4個標簽分別是xsi:type,xsi:nil,xsi:schemaLocation,xsi:noNamespaceSchemaLocation,這幾個屬性只有聲明了xsi命名空間后才能使用。

    1. xsi:schemaLocation:這個標簽的作用是引用xsd文件來校驗自己的格式,其引用值是一對url,用空格分開。
      比如文首例子中xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd",空格前是xsd文件的目標命名空間,空格后是xsd文件的所在物理位置。(xsd文件后面會介紹)

    2. xsi:noNamespaceSchemaLocation:和第一點作用一樣,區(qū)別就是這個不需要命名空間,因為有的xsd文件沒有使用命名空間。

XSD文件<schema>標簽

xsd文件其實也是xml文件,它的作用是校驗一個xml文件的格式,dtd文件也是同樣作用,但是xsd功能更加強大,語法更加優(yōu)雅。

這是一個<schema>標簽,它是xsd的核心標簽:

<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ù)前面講的,我們知道這是一個默認命名空間。
    因為xsd文件也是xml文件,也是由元素,屬性組成的,所以這行就是聲明xsd文件需要的元素及屬性是定義在"http://www.w3.org/2001/XMLSchema"這個命名空間里的。

這個命名空間是已經(jīng)被W3C保留定義好的,用戶不要去更改它。

  • 前面提到 xsi:schemaLocation屬性,其中用到了xsd的目標命名空間(targetNamespace)屬性,也就是targetNamespace="http://www.library.com"行。它的作用是把我們自己寫的xsd元素及屬性保存到targetNamespace所聲明的空間里,也就是xsi:schemaLocation屬性所要引用的地址,這樣就可以完成校驗功能,有點像我們程序中package概念。

如果沒有定義targetNamespace屬性,就說明此xsd沒有目標命名空間,那么在xml引用時使用xsi:schemaLocation即可。

  • elementFormDefault="qualified">
    attributeFormDefault="unqualified">功能相似。
    在xsd我們可以對元素(element)和屬性(attribute)進行"限定",能夠使xsd文件的配置更加靈活。他們都有qualifiedunqualified兩個值。
    如果選擇qualified,那我們xsd文件中中的所有元素和屬性都必須有一個命名空間。
    如果選擇unqualified,那么只有全局聲明(可以理解為外層元素,<schema>標簽下一層)的元素和屬性才必須具有命名空間,,其他子元素和屬性可以沒有命名空間修飾(屬于無命名空間)。

以上就是xml/xsd文件命名空間配置介紹。

參考資料:

<br /><br />


文章內(nèi)容為個人理解,如有錯誤歡迎指出。

郵箱:CodingDjz@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,535評論 19 139
  • 最近繼續(xù)看Struts,在看struts.xml配置的時候看到這個: [html]view plaincopy p...
    ad8d261a83e4閱讀 1,166評論 0 1
  • 1. XML簡介 以下內(nèi)容來自于http://www.w3school.com.cn/xml 基本知識 XML 和...
    WebSSO閱讀 2,092評論 1 7
  • 注:本文翻譯自developer.mozilla.org/en/docs/Web/SVG/Namespaces_C...
    wengjq閱讀 12,869評論 1 14
  • 1. XML總結(jié) 1.1. XML簡介 XML : 可擴展的標記語言。(和HTML非常類似的) 可擴展的。 自定義...
    Ethan_Walker閱讀 3,372評論 0 12

友情鏈接更多精彩內(nèi)容