En XSD eksempel
- Forrige side XSD Element erstatning
- Næste side XSD Streng
Dette afsnit vil vise dig, hvordan du skriver en XML Schema. Du vil også lære forskellige metoder til at skrive schemaer.
XML-dokument
Lad os se på XML-dokumentet ved navn "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>
Denne XML-dokument inkluderer rod-elementet "shiporder", som indeholder en nødvendig egenskab ved navn "orderid". Elementet "shiporder" indeholder tre forskellige under-elementer: "orderperson", "shipto" og "item". Elementet "item" optræder to gange, og det indeholder en "title", en valgfri "note"-element, en "quantity" og et "price"-element.
Denne linje xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" informerer XML-parseren om at validere dokumentet efter en bestemt schema. Denne linje: xsi:noNamespaceSchemaLocation="shiporder.xsd" angiver placeringen af schemaet (her er det i samme mappe som "shiporder.xml").
Opret en XML Schema
Nu skal vi oprette en schema for den ovenstående XML-dokument.
Vi kan begynde ved at åbne en ny fil og navngive den "shiporder.xsd". For at oprette schema skal vi blot følge strukturen i et XML-dokument og definere hver enkelt element, vi finder. Først starter 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 ovenstående schema brugte vi den standardiserede navnerum (xs), som er forbundet med Schema's sprogdefinition (Schema language definition), hvis standardværdi er http://www.w3.org/2001/XMLSchema.
Næste, skal vi definere "shiporder"-elementet. Dette element har en egenskab, der indeholder andre elementer, så vi identificerer det som en kompleks type. Under elementerne i "shiporder" er der en xs:sequence, der definerer rækkefølgen af underelementerne:
<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ... </xs:complexType> </xs:element>
Herefter skal vi definere "orderperson"-elementet som en enkel type (dette skyldes, at det ikke indeholder nogen egenskaber eller andre elementer). Typens præfiks (xs:string) defineres af navnerummet, som er forbundet med XML schema, der angiver prædefinerede schema data typer:
<xs:element name="orderperson" type="xs:string"/>
Næste, skal jeg definere to elementer som komplekse typer: "shipto" og "item". Vi starter med at definere "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>
Gennem schema kan vi bruge maxOccurs- og minOccurs-attributterne til at definere, hvor mange gange et element kan optræde. maxOccurs definerer maksimalt antal gange et element kan optræde, mens minOccurs definerer minimum antal gange. Standardværdierne for maxOccurs og minOccurs er begge 1!
Nu kan vi definere "item"-elementet. Dette element kan optræde flere gange inden for "shiporder"-elementet. Dette opnås ved at sætte maxOccurs-attributværdien for "item"-elementet til "unbounded", så "item"-elementet kan optræde så mange gange som skaberne ønsker. Bemærk venligst, at "note"-elementet er valgfrit. Vi har allerede sat minOccurs-attributværdien for dette element til 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 erklære egenskaberne for "shiporder"-elementet. Da dette er en obligatorisk egenskab, bestemmer vi use="required".
Kommentarer:Erklæringen af denne egenskab skal placeres sidst:
<xs:attribute name="orderid" type="xs:string" use="required"/>
Dette er dokumentlisten for schema-filen med navnet "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>
Del op schema
Den tidligere designmetode er meget enkel, men svær at læse og vedligeholde, når dokumentet er komplekst.
Den næste præsenterede designmetode baseres på først at definere alle elementer og egenskaber, og derefter bruge ref-egenskaben til at referere til dem.
Dette er et schema-dokument designet med en ny metode:
<?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>
Brug af specifikke typer (Navngivne Typer)
Den tredje designmetode definerer klasser eller typer, så vi har mulighed for at gentage definitionen af elementer. Den specifikke måde er: Først navngiv de enkle og komplekse elementer, derefter henviser vi til dem gennem elementets type-attribut.
Dette schema er designet ved hjælp af den tredje metode ("shiporder.xsd"):
<?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 viser, at datatypen stammer fra W3C XML Schema navnerum. Derfor betyder nedenstående fragment, at værdien af elementet eller egenskaben skal være en strengtype værdi:
<xs:restriction base="xs:string">
restriction element bruges ofte til at pålægge begrænsninger til elementer. Se nedenstående fragmenter fra ovennævnte schema:
<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType>
Dette kodeeksempel indikerer, at værdien af elementet eller egenskaben skal være en streng og skal være kontinuerlige seks tegn, og disse tegn skal være 0-9 tal.
- Forrige side XSD Element erstatning
- Næste side XSD Streng