Μια παράδειγμα XSD

Αυτό το κεφάλαιο θα σας δείξει πώς να γράψετε ένα XML Schema. Θα μάθετε επίσης διαφορετικές μεθόδους γραφής schema.

XML έγγραφο

Ας δούμε το XML έγγραφο με το όνομα "shiporder.xml":

<?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>

Το XML έγγραφο παραπάνω περιέχει την ρίζα "shiporder", η οποία περιέχει την ιδιότητα που ονομάζεται "orderid". Ο στοιχείο "shiporder" περιέχει τρία διαφορετικά υποστοιχεία: "orderperson", "shipto" και "item". Το στοιχείο "item" εμφανίζεται δύο φορές, περιέχει ένα "title", ένα προαιρετικό στοιχείο "note", ένα "quantity" και ένα στοιχείο "price".

Η γραμμή παραπάνω xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ενημερώνει τον αναγνώστη XML να επιβεβαιώσει το έγγραφο με βάση κάποιο schema. Η γραμμή: xsi:noNamespaceSchemaLocation="shiporder.xsd" καθορίζει τη θέση του schema (εδώ, βρίσκεται στον ίδιο φάκελο με το "shiporder.xml").

Δημιουργία ενός XML Schema

Τώρα, πρέπει να δημιουργήσουμε ένα schema για το παραπάνω XML έγγραφο.

Μπορούμε να ξεκινήσουμε με την ανοίγηση ενός νέου αρχείου και να το ονομάσουμε "shiporder.xsd". Για να δημιουργήσουμε το schema, πρέπει απλώς να ακολουθήσουμε τη δομή του XML εγγράφου, ορίζοντας κάθε στοιχείο που βρούμε.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs:schema>

Στο παραπάνω schema, χρησιμοποιούμε τον τυπικό χώρο ονομάτων (xs), ο οποίος σχετίζεται με το URI του γλώσσας ορισμού του Schema (Schema language definition), το οποίο έχει ως τυπική τιμή http://www.w3.org/2001/XMLSchema.

Επόμενα, πρέπει να ορίσουμε το στοιχείο "shiporder". Αυτό το στοιχείο έχει μια attribute που περιέχει άλλα στοιχεία, οπότε το θεωρούμε συνδυασμένο τύπο. Οι υποστοιχεία του στοιχείου "shiporder" περιλαμβάνονται μέσα στο στοιχείο xs:sequence, ορίζοντας τη σειρά των υποστοιχείων:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

Στη συνέχεια, πρέπει να ορίσουμε το στοιχείο "orderperson" ως απλό τύπο (αυτό γιατί δεν περιέχει καμία attribute ή άλλα στοιχεία). Ο πρόθεμα του τύπου (xs:string) ορίζεται από το πρόθεμα του ονόματος του χώρου, ο οποίος σχετίζεται με το XML schema που καθορίζει τα προκαθορισμένα δεδομένα του schema:

<xs:element name="orderperson" type="xs:string"/>

Επόμενα, πρέπει να ορίσουμε δύο στοιχεία ως συνδυασμένο τύπο: "shipto" και "item". Αρχίζουμε με τη διαμόρφωση του στοιχείου "shipto":

<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, μπορούμε να χρησιμοποιήσουμε τις attribute maxOccurs και minOccurs για να ορίσουμε τον αριθμό των φορών που μπορεί να εμφανιστεί ένα στοιχείο. Η maxOccurs ορίζει τον μέγιστο αριθμό φορών που μπορεί να εμφανιστεί ένα στοιχείο, ενώ η minOccurs ορίζει τον ελάχιστο αριθμό φορών που μπορεί να εμφανιστεί ένα στοιχείο. Η προεπιλεγμένη τιμή για τις maxOccurs και minOccurs είναι 1!

Τώρα, μπορούμε να ορίσουμε το στοιχείο "item". Αυτό το στοιχείο μπορεί να εμφανίζεται πολλές φορές μέσα στο στοιχείο "shiporder". Αυτό επιτυγχάνεται με την οριστική της τιμής του attributes maxOccurs στο "unbounded", ώστε το στοιχείο "item" να μπορεί να εμφανίζεται όσο το επιθυμεί ο δημιουργός. Λάβετε υπόψη ότι το στοιχείο "note" είναι επιλογή. Εμείς έχουμε ορίσει την attribute minOccurs του στοιχείου σε 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>

Τώρα, μπορούμε να δηλώσουμε τις ιδιότητες του στοιχείου "shiporder" και επειδή είναι υποχρεωτική, ορίζουμε use="required".

Σημείωση:Η αναφορά αυτής της ιδιότητας πρέπει να τοποθετηθεί στο τέλος:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Αυτό είναι το πίνακα περιεχομένων του αρχείου schema με το όνομα "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

Η προηγούμενη μέθοδος σχεδιασμού είναι πολύ εύκολη, αλλά όταν το έγγραφο είναι πολύπλοκο, είναι δύσκολο να διαβαστεί και να συντηρηθεί.

Η επόμενη μεθοδος σχεδιασμού βασίζεται στη πρώτη περιγραφή όλων των στοιχείων και ιδιοτήτων, και στη συνέχεια στην χρήση της ιδιότητας ref για την αναφορά τους.

Αυτό είναι το αρχείο schema που σχεδιάστηκε με νέο τρόπο:

<?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>

Χρήση καθορισμένων τύπων (Named Types)

Η τρίτη μέθοδος σχεδιασμού ορίζει κλάσεις ή τύπους,这样使我们有能力重复使用元素的定义。Concretely, the way is: first, name the simple elements and composite elements, and then point to them through the type attribute of the elements.

Αυτό είναι το αρχείο schema που σχεδιάστηκε με τη τρίτη μέθοδο ("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" δείχνει ότι ο τύπος δεδομένων προέρχεται από το χώρο ονομάτων W3C XML Schema. Επομένως, η παρακάτω μονάδα σημαίνει ότι η τιμή του στοιχείου ή της ιδιότητας πρέπει να είναι μια τιμή τύπου 문자:

<xs:restriction base="xs:string">

Το στοιχείο restriction χρησιμοποιείται συχνά για να επιβάλλει περιορισμούς στα στοιχεία. Δείτε αυτά τα εξής κομμάτια από το παραπάνω schema:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

Αυτό το κείμενο δείχνει ότι η τιμή του στοιχείου ή της ιδιότητας πρέπει να είναι αλφαριθμητική και να αποτελείται από συνεχείς έξι χαρακτήρες, και αυτοί οι χαρακτήρες πρέπει να είναι αριθμοί 0-9.