En XSD instans

Denna sektion kommer att visa hur man skriver en XML Schema. Du kommer också att lära dig olika metoder för att skriva schema.

XML-dokument

Låt oss titta på detta XML-dokument med namnet "shiporder.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>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</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>

Ovanstående XML-dokument inkluderar rot-elementet "shiporder", som innehåller ett nödvändigt attribut med namnet "orderid". Elementet "shiporder" innehåller tre olika underelement: "orderperson", "shipto" och "item". Elementet "item" förekommer två gånger, och det innehåller en "title", ett valfritt "note"-element, en "quantity" och ett "price"-element.

Ovanstående rad xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" informerar XML-parser att validera dokumentet enligt en viss schema. Denna rad: xsi:noNamespaceSchemaLocation="shiporder.xsd" anger platsen för schema (här är det i samma katalog som "shiporder.xml").

Skapa ett XML Schema

Nu behöver vi skapa ett schema för den ovanstående XML-dokumenten.

Vi kan börja med att öppna en ny fil och döpa den till "shiporder.xsd". För att skapa ett schema behöver vi endast följa strukturen i ett XML-dokument och definiera varje element vi hittar. Först börjar vi med en standard XML-deklaration:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs:schema>

I det ovanstående schemat använde vi den standardiserade namnrymden (xs), som är kopplad till Schema Language Definition (Schema language definition), med URI: http://www.w3.org/2001/XMLSchema.

Nästa steg är att definiera "shiporder"-elementet. Detta element har en egenskap som innehåller andra element, så vi identifierar det som ett komplext typ. Underelementen för "shiporder"-elementet omges av xs:sequence-elementet, som definierar underelementens ordning:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

Därefter behöver vi definiera "orderperson"-elementet som ett enkelt typ (detta eftersom det inte innehåller några egenskaper eller andra element).Prefixet för typen (xs:string) definieras av namnrymdens prefix, som är kopplad till XML schema som indikerar fördefinierade schema-datatyper:

<xs:element name="orderperson" type="xs:string"/>

Nästa steg är att definiera två element som komplexa typer: "shipto" och "item". Vi börjar med att definiera "shipto"-elementet:

<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>

Genom schema kan vi använda maxOccurs- och minOccurs-egenskaperna för att definiera hur många gånger ett element kan uppträda. maxOccurs definierar det maximala antalet gånger ett element kan uppträda, medan minOccurs definierar det minsta antalet gånger ett element kan uppträda. Standardvärdet för både maxOccurs och minOccurs är 1!

Nu kan vi definiera "item"-elementet. Detta element kan uppträda flera gånger inom "shiporder"-elementet. Detta uppnås genom att sätta värdet på maxOccurs-egenskapen för "item"-elementet till "unbounded", så att "item"-elementet kan uppträda så många gånger skaparen vill.Observera att "note"-elementet är valfritt. Vi har redan satt minOccurs-egenskapen för detta element till 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>

Nu kan vi deklarera egenskaperna för "shiporder"-elementet. Eftersom detta är ett obligatoriskt attribut, specificerar vi use="required".

Kommentar:Deklarationen av detta attribut måste placeras sist:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Detta är dokumentlistan för schema-filen med namnet "shiporder.xsd":

<?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-uppdelning

Den tidigare designmetoden är mycket enkel, men svår att läsa och underhålla när dokumentet är komplext.

Nästa introducerade designmetod baseras på att först definiera alla element och egenskaper, och sedan använda ref-attributet för att hänvisa till dem.

Detta är ett schema-fil som är utformat med en ny metod:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 简易元素的定义 -->
<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"/>
<!-- 属性的定义 -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- 复合元素的定义 -->
<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>

Använd specifika typer (Namngivna Typer)

Den tredje designmetoden definierar klasser eller typer, vilket ger oss förmågan att återanvända element-definitioner. Detta görs genom att först namnge enkla och komplexa element, och sedan peka på dem via elementets type-attribut.

Detta är ett schema-fil ("shiporder.xsd") som är utformad med den tredje metoden:

<?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-element visar att datatypen kommer från W3C XML Schema-namnrymdens datatyper. Därför innebär följande fragment att värdet för elementet eller egenskapen måste vara en strängtyps värde:

<xs:restriction base="xs:string">

restriction-element används ofta för att applicera begränsningar på element. Se nedan dessa fragment från ovanstående schema:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

Detta kodexempel indikerar att värdet för elementet eller egenskapen måste vara en sträng och måste vara en följd av sex kontinuerliga tecken, och dessa tecken måste vara siffror mellan 0 och 9.