論壇 | 最新的Web開發教程
 

一個XSD實例


本章將演示如何編寫一個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:no​​NamespaceSchemaLocation =“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。