Acest capitol va demonstra modul în care să scrie o schemă XML. Veți învăța, de asemenea, că o schemă poate fi scris în diferite moduri.
Un document XML
Să aruncăm o privire la acest document XML numit "shiporder.xml" :
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</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>
Documentul XML de mai sus constă într - un element rădăcină, "shiporder" , care conține un atribut necesar numit "orderid" . "shiporder" elementul conține trei elemente copil diferite: "orderperson" , "shipto" și "item" . "item" elementul apare de două ori, și conține un "title" , un opțional "note" elementul, o "quantity" , și un "price" elementul.
Linia de mai sus: xmlns: xsi = „http://www.w3.org/2001/XMLSchema-instance“ spune parserul XML că acest document ar trebui să fie validat pe baza unei scheme. Linia: XSi: noNamespaceSchemaLocation = „shiporder.xsd“ specifică la care se află schema (here it is in the same folder as "shiporder.xml") .
Creați o schemă XML
Acum vrem să creăm o schemă pentru documentul XML de mai sus.
Începem prin deschiderea unui nou fișier pe care o vom numi "shiporder.xsd" . Pentru a crea schema am putea urma, pur și simplu structura în documentul XML și definesc fiecare element așa cum o găsim. Vom începe cu declarația XML standard, urmat de xs: elementul de schemă care definește o schemă:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
În schema de mai sus vom folosi spațiul de nume standard , (xs) , iar URI - ul asociat cu acest spațiu de nume este definiția limbajului schemă, care are valoarea standard a http://www.w3.org/2001/XMLSchema.
În continuare, trebuie să definim "shiporder" element. Acest element are un atribut și conține alte elemente, de aceea o considerăm ca fiind un tip complex. Elementele copil ale "shiporder" elementul este înconjurat de un xs: element de secvență care definește o secvență ordonată de elemente sub:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
Apoi , trebuie să definim "orderperson" element ca un tip simplu (deoarece nu conține atribute sau alte elemente). Tastați (xs:string) este prefixat cu prefixul spațiul de nume asociat cu XML Schema care indică un tip de date predefinit de schemă:
<xs:element name="orderperson" type="xs:string"/>
În continuare, trebuie să definim două elemente care sunt de tip complex: "shipto" și "item" . Începem prin definirea "shipto" elementul:
<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>
Cu scheme putem defini numărul de posibile evenimente pentru un element cu maxOccurs și atributele minOccurs. maxOccurs specifică numărul maxim de apariții pentru un element și minOccurs specifică numărul minim de evenimente pentru un element. Valoarea implicită pentru ambele maxOccurs și minOccurs este 1!
Acum putem defini "item" element. Acest element poate apărea de mai multe ori în interiorul unui "shiporder" elementul. Acest lucru este specificat prin setarea maxOccurs atributul de "item" elementul "unbounded" , ceea ce înseamnă că nu poate fi la fel de multe apariții ale "item" element ca dorințele autorului. Observați că "note" element este opțional. Am specificat acest lucru prin setarea minOccurs atributul la zero:
<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>
Putem declara acum atributul de "shiporder" element. Deoarece acesta este un atribut necesar vom specifica utilizarea = „necesară“.
Note: Declarațiile de atribute trebuie să vină întotdeauna ultima dată:
<xs:attribute name="orderid" type="xs:string" use="required"/>
Aici este lista completă a fișierului de schemă numită "shiporder.xsd" :
<?xml version="1.0" encoding="UTF-8" ?>
<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>
Împărțiți schima
Metoda de proiectare anterioară este foarte simplu, dar poate fi dificil de citit și de a menține atunci când documentele sunt complexe.
Următoarea metodă de proiectare se bazează pe definirea tuturor elementelor și atribute în primul rând, și apoi referindu -se la ele utilizând ref atribut.
Aici este noul design al fișierului schemei ("shiporder.xsd") :
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of simple elements -->
<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 of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- definition of complex elements -->
<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>
Utilizarea tipurilor Numit
A treia metodă de proiectare definește clase sau tipuri, care ne permite să reutilizeze definirea elementelor. Acest lucru se face denumind simpleTypes și complexTypes elemente, apoi indicați spre ele prin type de atribut al elementului.
Aici este a treia proiectare a fișierului de schemă ("shiporder.xsd") :
<?xml version="1.0" encoding="UTF-8" ?>
<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>
Elementul de restricție indică faptul că tipul de date este derivat dintr-un spațiu de nume XML Schema W3C datatype. Deci, următorul fragment înseamnă că valoarea elementului sau atribut trebuie să fie o valoare string:
<xs:restriction base="xs:string">
Elementul de restricție este mai des utilizată pentru a aplica restricții elementelor. Uită-te la următoarele linii din schema de mai sus:
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
Acest lucru indică faptul că valoarea elementului sau atribut trebuie să fie un șir de caractere, acesta trebuie să fie exact șase caractere într-un rând, iar aceste caractere trebuie să fie un număr între 0 și 9.