閱讀368 返回首頁    go 阿裏雲 go 技術社區[雲棲]


XML(1)——shema約束之命名空間

一、XML的兩種約束DTD和Schema
摘自IBM官網一段話:“XML DTD(XML的文檔類型定義)是近幾年來XML技術領域所使用的最廣泛的一種模式。但是由於XML DTD並不能完全滿足XML自動化處理的要求,例如不能很好實現應用程序不同模間的相互協調,缺乏對文檔結構、屬性、數據類型等約束的足夠描述等等,所以W3C於2001年5月正式推薦XML Schema為XML 的標準模式。顯然,W3C希望以XML Schema來作為XML模式描述語言的主流,並逐漸代替XML DTD”。可見Schema使用的越來越多,本文先闡述Shema約束中非常重要的概念命名空間

二、shema文件
student.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="https://www.w3.org/2001/XMLSchema" 
targetNamespace="https://www.example.org/student"
elementFormDefault="qualified">
<element name="student">
<complexType>
<sequence>
<element name="num" type="int" />
<element name="name" type="string" />
<element name="birthday" type="date" />
</sequence>
</complexType>
</element>
</schema>
student.xsd就是一個shema文件,本身也是XML格式的,也要符合一定的約束。通過幾個問題來理解xmlns和targetNamespace。

問題1如何保證shema文件唯一性:targetNamespace
因為在引用shema文件作為xml約束時,試想若有多個shema文件同名以哪一個約束為準呢?以shema通過命名空間的概念來確保唯一性,targetNamespace屬性就是指定這個xsd的命名空間的。通常使用url的形式作為targetNamespace的值來確保唯一性,而該url通常並不一定存在。

問題2如何引入shema規範:xmlns
xsd所有的標簽和屬性也必須符合schema規範,那element、complexType、sequence等標簽的規範從何而來呢?
通過xmlns屬性來指定shema約束。xmlns="https://www.w3.org/2001/XMLSchema"就表示student.xsd默認不加前綴的標簽和屬性必須符合w3s定義的一個schema約束。若shema文件不是w3c組織定義的就需要指定shema文件的位置。下麵xml引入student.xsd約束時有介紹。

問題3elementFormDefault是什麼意思
該屬性是一個枚舉值:qualified、unqualified。默認是unqualified表示隻關聯根標簽student,而qualified表示關聯所有標簽和屬性如num,name,birthday。


三、XML文件引入約束
方法1
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<student xmlns="https://www.example.org/student" 
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.example.org/student student.xsd">
<num>1000</num>
<name>xy</name>
<birthday>2000-01-01</birthday>
</student>
student.xml指定了xmlns="https://www.example.org/student"約束,就是自定義的student.xsd。但正如問題②所說shema文件不是w3c組織定義的就需要指定shema文件的位置。

問題4如何指定xsd位置:schemaLocation
通過schemaLocation指定shema文件位置。但schemaLocation屬性由https://www.w3.org/2001/XMLSchema-instance約束,所以需要再通過xmlns引入這個約束。但一個標簽中隻允許一個不帶前綴的xmlns標簽,所以要給新的xmlns帶一個前綴xsi,前綴名自定義。以下的例子很好的說明了前綴的用法:
<?xml version="1.0" encoding="UTF-8"?>
<xy:student
xmlns:xy="https://www.example.org/student"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.example.org/student student.xsd">
<xy:num>1000</xy:num>
<xy:name>xy</xy:name>
<xy:birthday>2000-01-01</xy:birthday>
</xy:student>

方法2
沒有通過指定shema的命名空間而是xsd問位置來確定約束。
<?xml version="1.0" encoding="UTF-8"?>
<xy:student
xmlns:xy="https://www.example.org/student" 
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="/studnet.xsd">
<xy:num>1000</xy:num>
<xy:name>xy</xy:name>
<xy:birthday>2000-01-01</xy:birthday>
</xy:student>


首段摘自:https://www.ibm.com/developerworks/cn/xml/x-sd/

最後更新:2017-04-03 20:19:26

  上一篇:go 生老病死相互扶持這事真特麼不是鬧著玩的。
  下一篇:go linux/Aix啟動、關閉Oracle及監聽