最新的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。