En XSD eksempel
- Forrige side XSD elementudskiftning
- Næste side XSD streng
Dette afsnit vil vise dig, hvordan du skriver en XML Schema. Du vil også lære om forskellige metoder til at skrive schemaer.
XML-dokument
Lad os se på XML-dokumentet med navnet "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 roden "shiporder", som indeholder et krævet attribut med navnet "orderid". Elementet "shiporder" indeholder tre forskellige underelementer: "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 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 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 skridt er at definere "shiporder"-elementet. Dette element har en egenskab, der indeholder andre elementer, så vi betragter det som et komplekst type. Underelementerne til "shiporder"-elementet er omgivet af xs:sequence-elementet, der definerer rækkefølgen af underelementerne:
<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ... </xs:complexType> </xs:element>
Dernæst skal vi definere "orderperson"-elementet som en simpel type (dette skyldes, at det ikke indeholder nogen egenskaber eller andre elementer). Præfikset for type (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 skridt er at 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 mindste 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 deklarere egenskaberne for "shiporder"-elementet. Da dette er en obligatorisk egenskab, bestemmer vi use="required".
Kommentarer:Deklarationen af denne egenskab skal placeres i sidste række:
<xs:attribute name="orderid" type="xs:string" use="required"/>
Dette er dokumentationen 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>
Opdel 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 er baseret på først at definere alle elementer og egenskaber, og derefter bruge ref-egenskaben til at referere til dem.
Dette schema-dokument er 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"/> <!-- Definition af egenskaber --> <xs:attribute name="orderid" type="xs:string"/> <!-- Definition af komplekse elementer --> <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 specificerede typer (Navngivne Typer)
Den tredje designmetode definerer klasser eller typer, hvilket gør det muligt for os at gentage brugen af elementdefinitioner. Specifikken er: Først navngiver vi enkle og komplekse elementer, og derefter peger vi på dem gennem elementets type-attribut.
Dette er et schema-dokument ("shiporder.xsd") designet ved hjælp af den tredje metode:
<?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>
Elementet "restriction" viser, at datatypen kommer fra W3C XML Schema-namningsrummet. Derfor betyder de følgende fragmenter, 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 på 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 kodeindeks 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 tal mellem 0 og 9.
- Forrige side XSD elementudskiftning
- Næste side XSD streng