概述
XSD(XML模式定義)是網際網路聯盟推薦的,它規定了可擴展標記語言(XML)檔案中的元素的描述方式。這一描述可用來驗證檔案內容中各個項目與其內容將被取代的元素的描述是否一致。
XML模式表示XML對象(例如,檔案或檔案的一部分)的屬性及元素之間的相互關係。創建一個檔案的模式,需要分析其結構並定義所碰到的各個結構元素。與XML和HTML一樣,元素是在標記符集合的範圍內定義的。
與檔案類型定義(DTD)或簡單對象XML(SOX)等早期的XML模式語言相比,XSD具有幾個優點。例如,它更直接,它不需要語法分析器的中間處理,其它優點包括自文檔、自動模式創建以及可通過XML變換(XSLT)來查找的能力。然而,儘管XSD有其優點,有些批評者聲稱其語言不必那么複雜。
語法
我們需要在 XML 文檔中聲明模式,如下所示:
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema">
示例
下面的示例展示了如何使用模式:
<?xmlversion="1.0"encoding="UTF-8"?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:elementname="contact">
<xs:complexType>
<xs:sequence>
<xs:elementname="name"type="xs:string"/>
<xs:elementname="company"type="xs:string"/>
<xs:elementname="phone"type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML 模式背後的基本思想就是描述 XML 文檔可以接受的合法格式。
元素
正如我們在 XML 元素 一章中所看到的,元素就是 XML 文檔構建塊。在XSD內可以像下面這樣定義元素:
<xs:elementname="x"type="y"/>
定義類型
我們可以按照以下方式定義 XML 模式元素:
簡單類型:簡單類型的元素只能用於文本上下文中。一些預定義的簡單類型有:xs:integer,xs:boolean,xs:string,xs:data。例如:
<xs:elementname="phone_number"type="xs:int"/>
複雜類型:複雜類型就是其他元素定義的容器。允許我們指定哪個元素可以包含子元素以便為 XML 文檔提供一些結構。例如:
<xs:elementname="Address">
<xs:complexType>
<xs:sequence>
<xs:elementname="name"type="xs:string"/>
<xs:elementname="company"type="xs:string"/>
<xs:elementname="phone"type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
上面的例子中,Address 元素由子元素組成。它是其他 <xs:element> 定義的容器,允許我們在 XML 文檔中構建一個簡單的層級元素。
全局類型:對於全局類型,我們可以在文檔中定義獨立的類型,它還可以使用所有其他引用。例如,假設我們想針對不同的公司地址概括 person 和 company。這種情況下,我們可以定義一個如下所示的通用類型:
<xs:elementname="AddressType">
<xs:complexType>
<xs:sequence>
<xs:elementname="name"type="xs:string"/>
<xs:elementname="company"type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
然後在下面的示例中使用這個類型:
<xs:elementname="Address1">
<xs:complexType>
<xs:sequence>
<xs:elementname="address"type="AddressType"/>
<xs:elementname="phone1"type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:elementname="Address2">
<xs:complexType>
<xs:sequence>
<xs:elementname="address"type="AddressType"/>
<xs:elementname="phone2"type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
不再需要定義 name 和 compacny 兩次(一次是給 Address1,一次給 Address2),現在我們擁有一個獨立的定義。這讓維護變得更簡單,例如,如果我們決定給地址添加一個 "Postcode" 元素,只需要在一個地方添加即可 。
屬性
XSD中的屬性提供了元素的額外信息。帶 name 和 type 屬性(property)的屬性(attribute)如下所示:
XML/HTML Code複製內容到剪貼簿
<xs:attributename="x"type="y"/>