Yksi XSD esimerkki

Tämä luku näyttää sinulle, miten kirjoittaa XML Schema. Opit myös erilaisia schema:n kirjoittamistapoja.

XML-dokumentti

Tarkastellaanpa tätä nimeltä "shiporder.xml" olevaa XML-dokumenttia:

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

Yllä oleva XML-dokumentti sisältää juurielementin "shiporder", joka sisältää välttämättömän "orderid"-ominaisuuden. "shiporder"-elementti sisältää kolme eri alielementtiä: "orderperson", "shipto" ja "item". "item"-elementti esiintyy kahdesti, se sisältää "title"-ominaisuuden, valinnaisen "note"-elementin, "quantity"-ominaisuuden ja "price"-elementin.

Tämä rivi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ilmoittaa XML-tulkinnalle, että se vahvistaa dokumenttia jossain schema:n mukaan. Tämä rivi: xsi:noNamespaceSchemaLocation="shiporder.xsd" määrittää schema:n sijainnin (tässä se on samassa kansiossa kuin "shiporder.xml").

Luo XML Schema

Nyt meidän täytyy luoda schema yllä olevaa XML-dokumenttia varten.

Voimme aloittaa uuden tiedoston avaamisella ja nimetä sen "shiporder.xsd". Luodaksemme skeeman meidän täytyy yksinkertaisesti noudattaa XML-dokumentin rakennetta ja määrittää kaikki löytämämme elementit. Aloitaan ensin määrittämällä standardeja XML-ilmunauksia:

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

Ylläolevassa skeemassa käytimme standardeja nimenkerroksia (xs), jotka liittyvät skeeman kielen määrittämiseen (Schema language definition), jonka standardeina arvona on http://www.w3.org/2001/XMLSchema.

Seuraavaksi meidän täytyy määritellä "shiporder"-elementti. Tällä elementillä on yksi ominaisuus, joka sisältää muita elementtejä, joten pidämme sitä monimutkaiseksi tyyppinä. "shiporder"-elementin alielementit ovat xs:sequence-elementin sisällä, joka määrittää alielementtien järjestyksen:

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

Sitten meidän täytyy määritellä "orderperson"-elementti yksinkertaiseksi tyyppiksi (tämä johtuu siitä, että se ei sisällä minkään ominaisuuksia tai muita elementtejä). Tyyppin (xs:string) etuliite määräytyy nimenkerroksen etuliitteestä, joka liittyy XML-skeeman määrittämiin ennakkotietoihin, jotka liittyvät XML-skeeman määrittämään XML-datan tyyppiin:

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

Seuraavaksi minun täytyy määritellä kaksi elementtiä monimutkaiseksi tyyppiksi: "shipto" ja "item". Aloitaan "shipto"-elementin määrittelystä:

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

Schema:n avulla voimme käyttää maxOccurs- ja minOccurs-ominaisuuksia määrittääksemme, kuinka monta kertaa tietty elementti voi esiintyä. maxOccurs määrittää elementin mahdollisen esiintymien enimmäismäärän, kun taas minOccurs määrittää elementin mahdollisen esiintymien vähimmäismäärän. maxOccurs- ja minOccurs-ominaisuuksien oletusarvot ovat molemmat 1!

Nyt voimme määritellä "item"-elementin. Tämä elementti voi esiintyä useita kertoja "shiporder"-elementin sisällä. Tämä toteutetaan asettamalla "item"-elementin maxOccurs-ominaisuuden arvoksi "unbounded", jolloin "item"-elementti voi esiintyä luojan toivomalla määrällä kertoja. Huomaa, että "note"-elementti on valinnainen. Olemme asettaneet tämän elementin minOccurs-ominaisuuden arvoksi 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>

Nyt voimme määritellä "shiporder"-elementin ominaisuudet. Koska tämä on pakollinen ominaisuus, me määräämme use="required".

Huomautus:Tämän ominaisuuden määrittely on asetettava viimeiseksi:

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

Tämä "shiporder.xsd"-nimisen schema-tiedoston dokumenttilista on seuraava:

<?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:n erottelu

Edellinen suunnittelutapa on erittäin yksinkertainen, mutta dokumentin monimutkaisuuden vuoksi sitä on vaikea lukea ja ylläpitää.

Seuraava esitelty suunnittelutapa perustuu ensin kaikkien elementtien ja ominaisuuksien määrittelyyn ja sitten niiden viittaamiseen ref-ominaisuudella.

Tämä schema-tiedosto on suunniteltu uudella tavalla:

<?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"/>
<!-- Määrittelyn määrittely -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- Monimutkaisen elementin määrittely -->
<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>

Käytetään määriteltyjä tyyppien (Nimettyjä tyyppien)

Kolmas suunnittelumenetelmä määrittelee luokat tai tyypit, mikä antaa meille kyvyn käyttää elementtien määritelmiä uudelleen. Tämä tapahtuu seuraavasti: ensin nimetään yksinkertaiset ja monimutkaiset elementit, ja sitten elementtejä viitataan niiden type-ominaisuuden avulla.

Tämä schema-tiedosto ("shiporder.xsd") on suunniteltu kolmannella menetelmällä:

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

Rajoitus-elementti osoittaa, että tietotyyppi on peräisin W3C XML Schema -nimiavaruudesta. Siksi seuraava osa tarkoittaa, että elementin tai attribuutin arvon on oltava merkkijonotyyppinen arvo:

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

Rajoitus-elementti käytetään yleensä asettamaan rajoituksia elementille. Katso seuraavat pätkät yllä olevasta schema:stä:

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

Tämä koodi osoittaa, että elementin tai ominaisuuden arvon on oltava merkkijono, ja se on täytyy olla jatkuvia kuutta merkkiä, ja nämä merkit ovat 0-9 lukuja.