XML學習07-Schema約束

一、什麼是Schema約束
XML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是爲了克服 DTD 的侷限性。
特點:
·XML Schema 是使用一套預先定義好元素和屬性創建的。預先定義好元素和屬性規定了schema的結構和內容,schema規定了xml的文檔格式和內容。
·XML Schema本身也是XML,符合XML語法結構,擴展名通常爲xsd。
·DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。
·XML Schema對名稱空間支持得非常好。
·XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
·XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細緻的語義限制。
二、Schema的編寫格式和規則
1.語法
Schema遵循xml的語法結構。一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱爲schema。
2.名稱空間
定義:
編寫了一個XML Schema約束文檔後,通常需要把這個文件中聲明的元素綁定到一個URI地址上,在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文檔聲明的元素綁定到一個名稱空間上。在Xml文件中書寫標籤時,可以通過名稱空間聲明(xmlns),來聲明當前編寫的標籤來自哪個Schema約束文檔。
作用:
名稱空間用來唯一標識元素來自哪個schema。例如一個xml實例引用多個Schema,當兩個schema定義同名元素,爲了區分同名元素引用自哪個文檔須使用名稱空間。
格式:
·在schema文檔中使用預先定義好的元素和屬性(由w3c組織定義的),引用w3c元素和屬性的名稱空間 :xmlns="http://www.w3.org/2001/XMLSchema"
xmlns用來聲明當前編寫的標籤來自哪個Schema約束文檔。
·定義名稱空間,將schema中定義元素,綁定到URI地址(名稱空間)上,例如:targetNamespace="http://www.asdf.cn"
targetNamespace用於指定schema文檔中聲明的元素屬於哪個名稱空間。
·前綴、對元素和屬性的限定:elementFormDefault元素用於指定局部元素是否受到該schema指定targetNamespace所指定的名稱空間的限定;attributeFormDefault元素用於指定局部屬性是否受到該schema指定targetNamespace所指定的名稱空間的限定。可以設爲qualified 或者 unqualified。前綴作用和二者區別見對XSD schema文件中elementFormDefault屬性的理解
3.常用標籤和屬性
·element:元素標籤。每一個元素對應一個element。
·complexType:複雜元素標籤。包含子元素和屬性的元素爲複雜元素,在複雜元素標籤內應添加complexType標籤。
·sequence:順序標籤。複雜元素的子元素按順序排列,應在複雜元素complexType標籤內添加sequence標籤。
·any:any標籤表示可以引用任何一個元素。
·attribute:屬性標籤,爲當前外圍標籤元素添加屬性。
·type屬性:對於簡單元素(沒有子元素),使用type屬性指定簡單元素的類型。
·name屬性:名稱。
·minOccurs,maxOccurs:最少最多出現次數(”unbounded”多次)。

4.在XML實例文件中引用自定義的Schema名稱空間
1)xmlns用來聲明當前編寫的標籤來自哪個Schema約束文檔:
xmlns="http://www.asdf.cn"
2)聲明XML文件是一個應用了Schema技術的實例:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3)指定Schema文件位置:
xsi:schemaLocation=“http://www.asdf.cn(名稱空間) asdf.xsd(文件位置)"
三、Schema約束的示例
一個數據文件引用兩個Schema的示例:employee元素有兩個name子元素,分別表示部門名稱和員工名稱,分別引用不同的Schema。
1.約束company的xsd文件代碼

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/company"
        elementFormDefault="qualified">
    <element name="company">
        <complexType>
            <sequence>
                <element name="employee">
                    <complexType>
                        <sequence>
                            <any></any>
                            <!-- 員工名稱 -->
                            <element name="name" type="string"></element>
                        </sequence>
                        <!-- 添加age屬性 -->
                        <attribute name="age" type="int"></attribute>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

2.用於約束部門名稱的department.xsd文件代碼

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/department"
        elementFormDefault="qualified">
    <!-- 部門名稱 -->
    <element name="name" type="string"></element>
</schema>

3.xml文件代碼,通過前綴控制同名元素name引用哪個Schema

<?xml version="1.0" encoding="utf-8"?>
<company xmlns="http://www.example.org/company"
         xmlns:dept="http://www.example.org/department"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         <!-- 添加兩個Schema文件 -->
         xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd"
>
    <employee age="31">
        <!-- 部門名稱 -->
        <dept:name>人力資源部</dept:name>
        <!-- 員工名稱 -->
        <name>張三</name>
    </employee>
</company>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章