XML學習筆記(XML Schema)

Schema約束

  1. 什麼是Schema約束
           和DTD一樣,XML Schema也是一種用於定義和描述XML文檔結構與內容的模式語言,它的出現克服了DTD的侷限性。(DTD約束的筆記)
    DTD和XML Schema對比
DTD XML Schema
DTD採用的是非XML語法格式,缺乏對文檔結構、元素、數據類型等全面的描述; XML Schema採用的是XML語法格式,而且它本身也是一種XML文檔,因此,XML Schema的語法格式比DTD更好理解;
XML有非常高的合法性要求,雖然DTD和XML Schema都用於對XML文檔進行描述,都被用作驗證XML合法性的基礎,但是DTD本身合法性的驗證必須採用另一套機制; XML Schema則採用與XML文檔相同的合法性驗證機制;
DTD幾乎不支持名稱空間; XML Schema對名稱空間支持的非常好;
DTD支持的數據類型非常有限。例如,DTD可以指定元素中必須包含字符文本(PCADATA),但無法指定元素中必須包含非負整數(nonNegativeInteger); XML Schema比XML DTD支持更多的數據類型,包括用戶自定義數據類型;
DTD定義約束能力非常有限,無法對XML實例文檔做出更細緻的語義限制,例如,無法很好地指定一個元素中的某個子元素必須出現7~12次; XML Schema比XML DTD支持更多的數據類型,包括用戶自定義數據類型;

一個簡單的Schema文檔 Simple.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root" type="xs:string"/>
</xs:schema>

       在Simple.xsd中,第一行是文檔聲明,第二行中以xs:schema作爲根元素,表示模式定義的開始。由於根元素xs:schema的屬性都在http://www.w3.org/2001/XMLSchema名稱空間中,因此,在根元素上必須聲明該名稱空間。

  1. 名稱空間/命名空間
           一個XML文檔可以引入多個約束文檔,但是文檔中的元素和屬性都可以是自定義的,因此會出現命名衝突。在XML文檔中,提供名稱空間,它可以唯一標識一個元素或屬性。
    在使用名稱空間時,必須先聲明名稱空間。名稱空間的聲明就是在XML實例文檔中爲某個模式文檔的名稱空間指定一個臨時的簡寫名稱,它通過一系列的保留屬性來聲明,這種屬性的名字必須是以“xmlns”或者以“xmlns:”作爲前綴。它與其他任何XML屬性一樣,都可以通過直接或使用默認的方式給出。
    語法格式: <元素名 xmlns:prefixname="URL">
  • 元素名:指的是在哪一個元素上聲明名稱空間,在這個元素上聲明的名稱空間適用於聲明它的元素和屬性,以及該元素中嵌套的所有元素及其屬性。
  • xmlns:prefixname:指的是該元素的屬性名,他所對應的值是一個URL引用,用來標識該名稱空間的名稱。如果有兩個URL並且其組成的字符完全相同,就可以認爲他們標識的是同一個名稱空間
/**
 *student.xsd 展示如何使用Schema語法和命名空間
 */
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefaulted="unqualified">
    <xs:element name="學生名冊">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="學生">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="姓名" type="xs:string"/>
                            <xs:element name="性別" type="mySex"/>
                            <xs:element name="年齡" type="muAge"/>
                        </xs:sequence>
                        <xs:attribute name="學號" type="xs:integer" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:simpleType name="myAge">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="7"/>
            <xs:maxInclusive value="29"/>
        </xs:restriction>
    </xs:simpleType>


    <xs:simpleType name="mySex">
        <xs:restrivtion base="xs:string">
            <xs:enumeration value="男"/>
            <xs:enumeration value="女"/>
        </xs:restrivtion>
    </xs:simpleType>
</xs:schema>

/**
 *student.xml
 */
<?xml version="1.0" encoding="UTF-8"?>
<學生名冊>
    <學生 學號="1">
        <姓名>張三</姓名>
        <性別>男</性別>
        <年齡>20</年齡>
    </學生>
    
    <學生 學號="2">
        <姓名>李四</姓名>
        <性別>女</性別>
        <年齡>19</年齡>
    </學生>
    
    <學生 學號="3">
        <姓名>王五</姓名>
        <性別>男</性別>
        <年齡>21</年齡>
    </學生>
</學生名冊>

       注意:名稱空間的名字語法容易讓人混淆,儘管以 http:// 開始,那個 URL 並不指向一個包含模式定義的文件。事實上,這個 URL:http://www.ljc.cn根本沒有指向任何文件,只是一個分配的名字 。
在這裏插入圖片描述
3. 引入Schema文檔
       想要通過XML Schema文件對某個文檔進行約束,必須將XML文檔與Schema文件進行關聯。在XML文檔中引入Schema文件有兩種方式,集體如下:
(1)使用名稱空間引入XML Schema文檔
       使用名稱空間引入XML Schema文檔,需要通過屬性xsi:schemaLocation來聲明名稱空間文檔,xsi:schemaLocation屬性是在標準命名空間“http://www.w3.org/2001/XMLSchema-instance”中定義的,該屬性包含了兩個URL,兩個URL之間用空白符分隔。

<?xml version="1.0" encoding="UTF-8" ?>
<書架 xmlns="http://www.itcase.com"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://www.com xmlbook.xsd>
	<書>
		<書名>javascript權威指南</書名>
		<作者>Flanagan</作者>
		<售價>139元</售價>
	</書>
</書架>

       xsi:schemaLocation屬性值中可以包含多對名稱空間與他們所對應的XML Schema 文檔的存儲位置,每一對名稱空間的設置信息之間採用空格分隔。

(2)不使用名稱空間引入XML Schema文檔
       在XML文檔中引入XML Schema文檔,不僅可以通過xsi:schemaLocation屬性引入名稱空間的文檔,還可以通過xsi:noNamespcaeSchemaLocation屬性直接指定。xsi:noNamespcaeSchemaLocation屬性也在標準名稱空間“http://www.w3.org/2001/XMLSchema-instance”中定義,它用於定義指定文檔的位置。

<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
		  xsi:noNamespaceSchemaLocation="xmlbook.xsd">
	<書>
		<書名>javascript權威指南</書名>
		<作者>Flanagan</作者>
		<售價>139元</售價>
	</書>
</書架>
<!-- 文檔xmlbook.xsd與引用它的實例文檔位於同一目錄中 -->

Schema語法

  1. 元素定義
<xs:element name="元素的名稱" type="元素的數據類型"/>

其中type數據類型有多種:

  • xs:string:表示字符串類型
  • xs:decimal:表示小數類型
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time
xml示例代碼
<bookname>siry</bookname>
<price>50</price>
<birthday>1998-02-28</birthday>

對應的Schema代碼
<xs:element name="bookname" type="xs:string"/>
<xs:element name="price" type="xs:integer"/>
<xs:element name="birthday" type"xs:date"/>
  1. 屬性的定義:<xs:attribute name="屬性的名稱" type="屬性的數據類型">
xml示例代碼
<name lang="EN">siry</name>

對應的Schema代碼
<xs:attribute name="lang" type="xs:string">
  1. 簡單類型
           在XML Schema文檔中,只包含字符數據的元素都是簡單類型的。簡單類型使用xs:complexType元素定義。如果要對元素進行限制,需要使用xs:restriction元素;
    幾種常用的簡單類型元素限定元素
  • xs:minInclusive和xs:maxInclusive元素對值的最大值和最小值限定
員工工作年齡要求爲18~55歲
<xs:element name="eage">
    <xs:simpleType>
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="18"/>
            <xs:maxInclusive value="55"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
  • xs:enumeration 元素 對一組值的限定
錢包的顏色只能是紅色、藍色、黃色、白色、黑色 
<xs:element name="wallet">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="red"/>
            <xs:enumeration value="blue"/>
            <xs:enumeration value="yellow"/>
            <xs:enumeration value="white"/>
            <xs:enumeration value="black"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
  • xs:pattern 元素對一系列值的限定
希望把XML元素的內容限定爲一系列可使用的數字或字母,可以使用模式約束(Pattern Constraint)
<xs:element name="letter">
   <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:pattern value="[a-z]"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>
  • xs:whiteSpace元素對空白字符的限定
whiteSpace元素有3個屬性值可以設定,分別是
preserve:表示元素不對任何空白字符進行處理
replace:表示移除所有空白字符
collapse:表示將所有空白字符縮減爲一個單一字符
<xs:element name="address">
   <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:whiteSpace value="preserve"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>
  • 更多的限制可以查看W3C文檔
  1. 複雜類型
           除去簡單類型之外,其他類型都是複雜類型。在定義複雜類型時,需要使用xs:conplexType,其可接受如下兩種子元素:
    xs:complexContent:用於定義包含簡單內容的複雜類型(開始標記和結束標記之間只包含字符數據)
    xs:simpleContent:用於定義包含複雜內容的複雜類型

複合元素的4中基本類型:

  • 空元素:這裏的空元素指的是不包含內容,只包含屬性的元素
xml代碼
<producet prodid="1234"/>

Schema代碼
<xs:element name="product">
    <xs:complexType>
        <xs:attribute name"prodid" type="xs:positiveInteger">
    </xs:complexType>
</xs:element>
  • 包含其他元素的元素
xml代碼
<person>
    <firstname>李</firstname>
    <lastname>四</lastname>
</person>

Schema代碼
<xs:element name="person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="firstname" type="xs:string"/>
            <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
  • 僅包含文本的元素
           對於僅包含文本的複合元素,需要使用simpleContent元素來添加元素。在使用簡易內容時,必須在simpleContent元素內定義擴展或限定,這是需要使用extension或restriction元素來擴展或限定元素的基本簡單類型。
xml代碼
<shoessize country="france">35</shoessize>

Schema代碼
<xs:element name="shoessize">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:integer">
                <xs:attribute name="country" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>
  • 包含元素和文本的元素
xml代碼
<letter>
    Dear Mr.<name>li</name>.
    Your order <orderid>1032</orderid>
    will be shipped on <shipdate>2019-12-26</shipdate>
</letter>

Schema代碼
<xs:element name="letter">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="orderid" type="xs:positiveInteger"/>
            <xs:element name="shipdate" type="xs:date"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
**爲了使字符能夠出現在letter元素的子元素之間,使用了mixed屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章