本章將演示如何編寫一個XML模式。 您還將學習一個模式可以以不同的方式來寫。
XML文檔
讓我們看看這個所謂的XML文檔"shiporder.xml"
<?xml version="1.0" encoding="UTF-8"?>
<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解析器。 該行:XSI:noNamespaceSchemaLocation =“shiporder.xsd”指定了架構所在(here it is in the same folder as "shiporder.xml")
創建一個XML Schema
現在,我們要創建上面的XML文檔的架構。
我們可以通過打開一個新的文件,我們將調用start "shiporder.xsd" 要創建模式,我們可以簡單地按照XML文檔中的結構和定義每一個元素,因為我們找到它。 它定義了一個架構模式元素:我們將與標準的XML聲明其次是XS入手:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
在上述模式中我們使用標準的命名空間(xs)與此命名空間相關聯,而URI是架構語言定義,其中有http://www.w3.org/2001/XMLSchema的標準值。
接下來,我們來定義"shiporder"的元素。 這個元素有一個屬性,它包含其他元素,因此,我們認為它是一個複雜的類型。 在的子元素"shiporder" ,它定義了子元素的有序序列序列元素:元素被包圍XS:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
然後我們定義"orderperson"元素作為一個簡單的類型(因為它不包含任何屬性或其他元素)。 類型(xs:string)的前綴與XML模式相關的命名空間前綴,表示一個預定義的模式數據類型:
<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>
用模式,我們可以定義可能出現的次數與將maxOccurs和的minOccurs屬性的元素。 maxOccurs的指定事件的最大數量為元素和的minOccurs指定的元件出現的最小數目。 為maxOccurs的和的minOccurs的默認值是1!
現在,我們可以定義"item"元素。 該元素可以在裡面多次出現的"shiporder"的元素。 這是通過設置指定maxOccurs的屬性"item"元素"unbounded" ,這意味著有可能是一樣多出現"item"元素作為作家的願望。 請注意, "note"元素是可選的。 我們已經通過設置指定此minOccurs屬性為零:
<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"的元素。 由於這是我們指定使用必需屬性=“必需的”。
Note:該屬性聲明必須總是放在最後:
<xs:attribute name="orderid" type="xs:string" use="required"/>
這是所謂的模式文件的完整列表"shiporder.xsd"
<?xml version="1.0" encoding="UTF-8" ?>
<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>
劃分模式
以往的設計方法是很簡單的,但可能難以讀取和當文檔是複雜的維護。
下一設計方法是基於定義的所有元素和第一屬性,然後使用引用它們ref屬性。
下面是schema文件的新設計("shiporder.xsd")
<?xml version="1.0" encoding="UTF-8" ?>
<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>
使用命名的類型
第三種設計方法定義的類或類型,使我們能夠重新使用元素定義。 這是通過命名simpleTypes和複合類型元件完成的,然後通過指向它們type元素的屬性。
下面是schema文件的第三個設計("shiporder.xsd")
<?xml version="1.0" encoding="UTF-8" ?>
<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>
約束元素表示該數據類型是由W3C XML Schema名稱空間數據類型的。 因此,下面的片段意味著元素或屬性的值必須是一個字符串值:
<xs:restriction base="xs:string">
限制元件更經常被用來限制適用於元素。 請看上述schema中的幾行:
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
這表明元素或屬性的值必須是一個字符串,它必須在連續整整6個字符,這些字符必須為數字從0到9。