XSD 实例

  • 一个XML文档

    让我们看一下这个名为 "shiporder.xml" 的 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" 行指定了模式所在的位置(此处与 "shiporder.xml" 位于同一文件夹中)。
  • 创建一个XML模式

    现在,我们要为上面的XML文档创建一个架构。
    我们首先打开一个新文件,我们将其称为 "shiporder.xsd"。 要创建模式,我们可以简单地遵循XML文档中的结构,并在找到它时定义每个元素。 我们将从标准 XML 声明开始,后跟定义模式的 xs:schema 元素:
    <?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:sequence 元素包围,该元素定义了子元素的有序序列:
    <xs:element name="shiporder">
      <xs:complexType>
        <xs:sequence>
          ...
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    然后,我们必须将 "orderperson" 元素定义为简单类型(因为它不包含任何属性或其他元素)。 类型(xs:string)的前缀是与 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>
    使用模式,我们可以使用maxOccurs和minOccurs属性定义元素可能出现的次数。 maxOccurs指定一个元素的最大出现次数,minOccurs指定一个元素的最小出现次数。 maxOccurs和minOccurs的默认值为1!
    现在我们可以定义 "item" 元素。 该元素可以在 "shiporder" 元素内多次出现。 这是通过将 "item" 元素的 maxOccurs 属性设置为 "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" 元素的属性。 由于这是必填属性,因此我们指定 use="required"。
    请注意:属性声明必须始终位于最后:
    <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属性引用它们。
    这是模式文件("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 和 complexTypes 元素,然后通过元素的 type 属性指向它们来完成的。
    这是模式文件("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">
    
    限制元素通常用于对元素施加限制。 在上面的模式中查看以下几行:
    <xs:simpleType name="orderidtype">
      <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{6}"/>
      </xs:restriction>
    </xs:simpleType>
    
    这表明元素或属性的值必须是字符串,必须连续精确地是六个字符,并且这些字符必须是 0 到 9 之间的数字。