En XSD instans
- Föregående sida XSD elementers ersättning
- Nästa sida XSD sträng
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å XML-dokumentet 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 rotlementet "shiporder", som innehåller ett nödvändigt attribut med namnet "orderid". Elementet "shiporder" innehåller tre olika underlement: "orderperson", "shipto" och "item". Elementet "item" uppträder 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-dokumentet.
Vi kan börja med att öppna en ny fil och döpa den till "shiporder.xsd". För att skapa schema behöver vi bara 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 ovanstående schema använde vi den standardiserade namnrymden (xs), som är associerad med Schema Language Definition (Schema language definition), med en standard URI http://www.w3.org/2001/XMLSchema.
Nästa steg är att definiera "shiporder"-elementet. Detta element har ett attribut som innehåller andra element, så vi identifierar det som ett komplext typ. Understitterna för "shiporder"-elementet omges av xs:sequence-elementet, som definierar understitternas 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 (eftersom det inte innehåller några egenskaper eller andra element).Prefixet för typen (xs:string) definieras av namnrymdens prefix, som är associerad med XML schema som indikerar fördefinierade schema-data typer:
<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-attributen 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 minimala antalet gånger. 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-attributet för "item"-elementet till "unbounded", vilket gör att "item"-elementet kan uppträda så många gånger skaparen önskar.Observera att "note"-elementet är valfritt. Vi har redan satt minOccurs-attributet 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 denna egenskap 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-delning
Den tidigare designmetoden är mycket enkel, men svår att läsa och underhålla när dokumentet är komplext.
Nästa beskrivna designmetod baseras på att först definiera alla element och egenskaper, och sedan använda ref-egenskapen 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"/> <!-- Definition av attribut --> <xs:attribute name="orderid" type="xs:string"/> <!-- Definition av komplex element --> <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 elementdefinitioner. 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 designas 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-nsammanhangets datatyper. Därför innebär följande fragment att värdet på 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 följande 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 från 0 till 9.
- Föregående sida XSD elementers ersättning
- Nästa sida XSD sträng