# XSD 實例
本節會為您演示如何編寫一個 XML Schema。您還將學習到編寫 schema 的不同方法。
## XML 文檔
讓我們看看這個名為 "shiporder.xml" 的 XML 文檔:
```
<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
? <orderperson>John Smith</orderperson>
? <shipto>
??? <name>Ola Nordmann</name>
??? <address>Langgt 23</address>
??? <city>4000 Stavanger</city>
??? <country>Norway</country>
? </shipto>
? <item>
??? <title>Empire Burlesque</title>
??? <note>Special Edition</note>
??? <quantity>1</quantity>
??? <price>10.90</price>
? </item>
? <item>
??? <title>Hide your heart</title>
??? <quantity>1</quantity>
??? <price>9.90</price>
? </item>
</shiporder>
```
上面的XML文檔包括根元素 "shiporder",其中包含必須名為 "orderid" 的屬性。"shiporder" 元素包含三個不同的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出現了兩次,它含有一個 "title"、一個可選 "note" 元素、一個 "quantity" 以及一個 "price" 元素。
上面這一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根據某個 schema 來驗證此文檔。這一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 規定了 schema 的位置(在這里,它與 "shiporder.xml" 處于相同的文件夾)。
## 創建一個 XML Schema
現在,我們需要為上面這個 XML 文檔創建一個 schema。
我們可以通過打開一個新的文件來開始,并把這個文件命名為 "shiporder.xsd"。要創建schema,我們僅僅需要簡單地遵循 XML 文檔中的結構,定義我們所發現的每個元素。首先我們開始定義一個標準的 XML 聲明:
```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
```
在上面的 schema 中,我們使用了標準的命名空間 (xs),與此命名空間相關聯的 URI 是 Schema 的語言定義(Schema language definition),其標準值是 http://www.w3.org/2001/XMLSchema。
接下來,我們需要定義 "shiporder" 元素。此元素擁有一個屬性,其中包含其他的元素,因此我們將它認定為復合類型。"shiporder" 元素的子元素被 xs:sequence 元素包圍,定義了子元素的次序:
```
<xs:element name="shiporder">
? <xs:complexType>
??? <xs:sequence>
????? ...
??? </xs:sequence>
? </xs:complexType>
</xs:element>
```
然后我們需要把 "orderperson" 元素定義為簡易類型(這是因為它不包含任何屬性或者其他的元素)。類型 (xs:string) 的前綴是由命名空間的前綴規定的,此命名空間與指示預定義的 schema 數據類型的 XML schema 相關聯:
```
<xs:element name="orderperson" type="xs:string"/>
```
接下來,我需要把兩個元素定義為復合類型:"shipto" 和 "item"。我們從定義 "shipto" 元素開始:
```
<xs:element name="shipto">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element name="name" type="xs:string"/>
????? <xs:element name="address" type="xs:string"/>
????? <xs:element name="city" type="xs:string"/>
????? <xs:element name="country" type="xs:string"/>
??? </xs:sequence>
? </xs:complexType>
</xs:element>
```
通過 schema,我們可使用 maxOccurs 和 minOccurs 屬性來定義某個元素可能出現的次數。maxOccurs 定義某元素出現次數的最大值,而 minOccurs 則定義某元素出現次數的最小值。maxOccurs 和 minOccurs 的默認值都是 1!
現在,我們可以定義 "item" 元素了。這個元素可在 "shiporder" 元素內部出現多次。這是通過把 "item" 元素的 maxOccurs 屬性的值設定為 "unbounded" 來實現的,這樣 "item" 元素就可出現創作者所希望的任意多次。請注意,"note" 元素是可選元素。我們已經把此元素的 minOccurs 屬性設定為 0 了:
```
<xs:element name="item" maxOccurs="unbounded">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element name="title" type="xs:string"/>
????? <xs:element name="note" type="xs:string" minOccurs="0"/>
????? <xs:element name="quantity" type="xs:positiveInteger"/>
????? <xs:element name="price" type="xs:decimal"/>
??? </xs:sequence>
? </xs:complexType>
</xs:element>
```
現在,我們可以聲明 "shiporder" 元素的屬性了。由于這是一個必選屬性,我們規定 use="required"。
**注意:**此屬性的聲明必須被置于最后:
```
<xs:attribute name="orderid" type="xs:string" use="required"/>
```
這是這個名為 "shiporder.xsd" 的 schema 文件的文檔清單:
```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element name="orderperson" type="xs:string"/>
????? <xs:element name="shipto">
??????? <xs:complexType>
????????? <xs:sequence>
??????????? <xs:element name="name" type="xs:string"/>
??????????? <xs:element name="address" type="xs:string"/>
??????????? <xs:element name="city" type="xs:string"/>
??????????? <xs:element name="country" type="xs:string"/>
????????? </xs:sequence>
??????? </xs:complexType>
????? </xs:element>
????? <xs:element name="item" maxOccurs="unbounded">
??????? <xs:complexType>
????????? <xs:sequence>
??????????? <xs:element name="title" type="xs:string"/>
??????????? <xs:element name="note" type="xs:string" minOccurs="0"/>
??????????? <xs:element name="quantity" type="xs:positiveInteger"/>
??????????? <xs:element name="price" type="xs:decimal"/>
????????? </xs:sequence>
??????? </xs:complexType>
????? </xs:element>
??? </xs:sequence>
??? <xs:attribute name="orderid" type="xs:string" use="required"/>
? </xs:complexType>
</xs:element>
</xs:schema>
```
## 分割 Schema
前面的設計方法非常容易,但當文檔很復雜時卻難以閱讀和維護。
接下來介紹的設計方法基于首先對所有元素和屬性的定義,然后再使用 ref 屬性來引用它們。
這是用新方法設計的 schema 文件("shiporder.xsd"):
```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- definition of complex elements -->
<xs:element name="shipto">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element ref="name"/>
????? <xs:element ref="address"/>
????? <xs:element ref="city"/>
????? <xs:element ref="country"/>
??? </xs:sequence>
? </xs:complexType>
</xs:element>
<xs:element name="item">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element ref="title"/>
????? <xs:element ref="note" minOccurs="0"/>
????? <xs:element ref="quantity"/>
????? <xs:element ref="price"/>
??? </xs:sequence>
? </xs:complexType>
</xs:element>
<xs:element name="shiporder">
? <xs:complexType>
??? <xs:sequence>
????? <xs:element ref="orderperson"/>
????? <xs:element ref="shipto"/>
????? <xs:element ref="item" maxOccurs="unbounded"/>
??? </xs:sequence>
??? <xs:attribute ref="orderid" use="required"/>
? </xs:complexType>
</xs:element>
</xs:schema>
```
## 使用指定的類型(Named Types)
第三種設計方法定義了類或者類型,這樣使我們有能力重復使用元素的定義。具體的方式是:首先對簡易元素和復合元素進行命名,然后通過元素的 type 屬性來指向它們
這是利用第三種方法設計的 schema 文件 ("shiporder.xsd"):
```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
? <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
? <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
? <xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
? <xs:restriction base="xs:string">
??? <xs:pattern value="[0-9]{6}"/>
? </xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
? <xs:sequence>
??? <xs:element name="name" type="stringtype"/>
??? <xs:element name="address" type="stringtype"/>
??? <xs:element name="city" type="stringtype"/>
??? <xs:element name="country" type="stringtype"/>
? </xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
? <xs:sequence>
??? <xs:element name="title" type="stringtype"/>
??? <xs:element name="note" type="stringtype" minOccurs="0"/>
??? <xs:element name="quantity" type="inttype"/>
??? <xs:element name="price" type="dectype"/>
? </xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
? <xs:sequence>
??? <xs:element name="orderperson" type="stringtype"/>
??? <xs:element name="shipto" type="shiptotype"/>
??? <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
? </xs:sequence>
? <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
```
restriction 元素顯示出數據類型源自于 W3C XML Schema 命名空間的數據類型。因此,下面的片段也就意味著元素或屬性的值必須是字符串類型的值:
```
<xs:restriction base="xs:string">
```
restriction 元素常被用于向元素施加限制。請看下面這些來自以上 schema 的片段:
```
<xs:simpleType name="orderidtype">
? <xs:restriction base="xs:string">
??? <xs:pattern value="[0-9]{6}"/>
? </xs:restriction>
</xs:simpleType>
```
這段代碼指示出,元素或屬性的值必須為字符串,并且必須是連續的六個字符,同時這些字符必須是 0-9 的數字。
- XML 基礎
- XML 簡介
- XML 用途
- XML 樹結構
- XML 語法規則
- XML 元素
- XML 屬性
- XML 驗證
- 查看 XML 文件
- 使用 CSS 顯示 XML
- 使用 XSLT 顯示 XML
- XML Javascript
- XMLHttpRequest 對象
- XML Parser
- XML DOM
- XML to HTML
- XML 應用程序
- XML 進階
- XML 命名空間
- XML CDATA
- XML 編碼
- 服務器上的 XML
- XML DOM 高級
- XML 注意事項
- XML 相關技術
- 現實生活中的 XML
- XML 編輯器
- XML - E4X
- DTD 教程
- DTD 簡介
- DTD - XML 構建模塊
- DTD - 元素
- DTD - 屬性
- XML 元素 vs. 屬性
- DTD - 實體
- DTD 驗證
- DTD - 來自網絡的實例
- XML DOM
- XML DOM 簡介
- XML DOM 節點
- XML DOM 節點樹
- XML DOM 解析器
- XML DOM 加載函數
- XML DOM - 屬性和方法
- XML DOM - 訪問節點
- XML DOM 節點信息
- XML DOM 節點列表
- XML DOM 遍歷節點樹
- XML DOM 瀏覽器差異
- XML DOM - 導航節點
- XML DOM 獲取節點值
- XML DOM 改變節點值
- XML DOM 刪除節點
- XML DOM 替換節點
- XML DOM 創建節點
- XML DOM 添加節點
- XML DOM 克隆節點
- The XMLHttpRequest 對象
- XML DOM 節點類型
- XML DOM - Node 對象
- XML DOM - NodeList 對象
- XML DOM - NamedNodeMap 對象
- XML DOM - Document 對象
- XML DOM - DocumentImplementation 對象
- XML DOM - DocumentType 對象
- XML DOM - ProcessingInstruction 對象
- XML DOM - Element 對象
- XML DOM - Attr 對象
- XML DOM - Text 對象
- XML DOM - CDATASection 對象
- XML DOM - Comment 對象
- XMLHttpRequest 對象
- XML DOM Parse Error 對象
- XML DOM 解析器錯誤
- XSLT 教程
- XSL 語言
- XSLT 簡介
- XSLT 瀏覽器
- XSLT - 轉換
- XSLT <xsl:template> 元素
- XSLT <xsl:value-of> 元素
- XSLT <xsl:for-each> 元素
- XSLT <xsl:sort> 元素
- XSLT <xsl:if> 元素
- XSLT <xsl:choose> 元素
- XSLT <xsl:apply-templates> 元素
- XSLT - 在客戶端
- XSLT - 在服務器端
- XSLT - 編輯 XML
- XML 編輯器
- XSLT 元素參考手冊
- XSLT 函數
- XPath 教程
- XPath 簡介
- XPath 節點
- XPath 語法
- XPath 軸(Axes)
- XPath 運算符
- XPath Examples
- XPath、XQuery 以及 XSLT 函數函數參考手冊
- 函數參考手冊
- XQuery 教程
- XQuery 簡介
- XQuery 實例
- XQuery FLWOR 表達式
- XQuery FLWOR + HTML
- XQuery 術語
- XQuery 語法
- XQuery 添加元素 和屬性
- XQuery 選擇 和 過濾
- XQuery 函數
- XQuery 參考手冊
- XLink 和 XPointer 教程
- XLink 和 XPointer 簡介
- XLink 和 XPointer 語法
- XLink 實例
- XPointer 實例
- XLink 參考手冊
- XML Schema 教程
- XML Schema 簡介
- 為什么使用 XML Schemas?
- XSD 如何使用?
- XSD - <schema> 元素
- XSD 簡易元素
- XSD 屬性
- XSD 限定 / Facets
- XSD 復合元素
- XSD 空元素
- XSD 僅含元素
- XSD 僅含文本
- XSD 混合內容
- XSD 指示器
- XSD <any> 元素
- XSD <anyAttribute> 元素
- XSD 元素替換(Element Substitution)
- XSD 實例
- XSD 字符串 數據類型
- XSD 日期和時間數據類型
- XSD 數值數據類型
- XSD 雜項 數據類型
- XML 編輯器
- XML Schema 參考手冊
- XSD 元素
- XSD 限定/Facets
- SOAP 教程
- SOAP 簡介
- SOAP 語法
- SOAP Envelope 元素
- SOAP Header 元素
- SOAP Body 元素
- SOAP Fault 元素
- SOAP HTTP 協議
- SOAP 實例
- WSDL 教程
- WSDL 簡介
- WSDL 文檔
- WSDL 端口
- WSDL 綁定
- WSDL UDDI
- RSS 教程
- RSS 簡介
- RSS 歷史
- RSS 語法
- RSS <channel> 元素
- RSS <item> 元素
- RSS 發布您的 Feed
- RSS 閱讀器
- RSS 參考手冊
- RDF 教程
- RDF 簡介
- RDF 規則
- RDF 實例
- RDF 主要 元素
- RDF 容器 Elements
- RDF 集合
- RDF Schema (RDFS)
- RDF 都柏林核心元數據倡議
- OWL 簡介
- RDF 參考手冊
- XSL-FO 教程
- XSL-FO 簡介
- XSL-FO 文檔
- XSL-FO 區域
- XSL-FO 輸出
- XSL-FO 流
- XSL-FO 頁面
- XSL-FO 塊
- XSL-FO 列表
- XSL-FO 表格
- XSL-FO 與 XSLT
- XSL-FO 軟件
- XSL-FO 參考手冊
- SVG 教程
- SVG 簡介
- SVG 實例
- SVG 在 HTML 頁面
- SVG <rect>
- SVG <circle>
- SVG <ellipse>
- SVG <line>
- SVG <polygon>
- SVG <polyline>
- SVG <path>
- SVG <text>
- SVG Stroke 屬性
- SVG 濾鏡
- SVG 模糊效果
- SVG 陰影
- SVG 漸變 - 線性
- SVG 漸變- 放射性
- SVG 參考手冊
- 免責聲明