Yksi XSD-esimerkki
- Edellinen sivu XSD - elementin korvaus
- Seuraava sivu XSD - merkkijonotyyppi
Tämä luku näyttää sinulle, miten kirjoittaa XML Schema. Opit myös eri schema-kirjoitusmenetelmät.
XML-asiakirja
Tarkastellaanpa tätä nimeltään "shiporder.xml" olevaa XML-asiakirjaa:
<?xml version="1.0" encoding="ISO-8859-1"?> <shiporder orderid="889923" <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-asiakirja sisältää juuri-elementin "shiporder", joka sisältää nimeltään "orderid" olevan ominaisuuden. "shiporder"-elementti sisältää kolme eri alielementtiä: "orderperson", "shipto" ja "item". "item"-elementti esiintyy kahdesti, se sisältää "title"-elementin, valinnainen "note"-elementin, "quantity"-elementin ja "price"-elementin.
Tämä rivi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ilmoittaa XML-parsin tarkistavan asiakirjan jossain schema:n mukaisesti. 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 avauksella ja nimetä sen "shiporder.xsd". Schema:n luomiseksi meidän täytyy yksinkertaisesti noudattaa XML-dokumentin rakennetta ja määritellä löytämämme jokainen elementti. Aloitetaan ensin määrittämällä standardinen XML-deklarointi:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... ... </xs:schema>
Ylläolevassa schema:ssa käytimme standardeja nimenkerroksia (xs), jotka liittyvät Schema-kielen määrittelyyn (Schema language definition), jonka standardiarvo on http://www.w3.org/2001/XMLSchema.
Seuraavaksi meidän täytyy määritellä "shiporder"-elementti. Tällä elementillä on ominaisuus, joka sisältää muita elementtejä, joten pidämme sitä monimutkaisena tyyppinä. "shiporder"-elementin alielementit sisältyvät xs:sequence-elementtiin, 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 schema -määrittelyyn, joka viittaa määritettyyn schema-datan XML schema -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äärittelyllä:
<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 elementin mahdollisen esiintymisen määrän. maxOccurs määrittää elementin esiintymisen enimmäismäärän, kun taas minOccurs määrittää elementin esiintymisen vähimmäismäärän. maxOccurs- ja minOccurs-ominaisuuksien oletusarvo on 1!
Nyt voimme määritellä "item"-elementin. Tämä elementti voi esiintyä useita kertoja "shiporder"-elementin sisällä. Tämä saavutetaan asettamalla "item"-elementin maxOccurs-ominaisuuden arvoksi "unbounded", jolloin "item"-elementti voi esiintyä luoja haluamana useita 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äärittää "shiporder"-elementin attribuutit. Koska tämä on pakollinen attribuutti, me määrittelemme use="required".
Huomautus:Tämän attribuutin 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 dokumentti on monimutkainen, mikä tekee siitä vaikean lukea ja ylläpitää.
Seuraavaa suunnittelutapaa perustuu ensin kaikkien elementtien ja attribuuttien määrittelyyn ja sitten niiden viittaamiseen ref-ominaisuuden avulla.
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"/> <!-- 属性的定义 --> <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>
Käytetään määriteltyjä tyyppien (Nimeytyt tyypit)
Kolmas suunnittelumenetelmä määrittelee luokat tai tyypit, mikä antaa meille kyvyn käyttää elementtien määritelmiä uudelleen. Tämä tapahtuu ensin nimeämällä yksinkertaiset ja monimutkaiset elementit, ja sitten osoittamalla ne elementin 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 W3C XML Schema -nimenkuvauksen alatyypin tietotyyppi. Siksi seuraava fragmentti tarkoittaa, että elementin tai attribuutin arvon on oltava merkkijonotyyppi:
<xs:restriction base="xs:string">
rajoitus-elementti käytetään yleensä asettamaan rajoituksia elementille. Katso seuraavat fragmentit, jotka ovat peräisin edellä olevasta schema:sta:
<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 oltava jatkuvia kuutta merkkiä, ja nämä merkit ovat 0-9:n numerot.
- Edellinen sivu XSD - elementin korvaus
- Seuraava sivu XSD - merkkijonotyyppi