一个 XSD 实例

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

Έγγραφο XML

Ας δούμε το έγγραφο XML με το όνομα "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>

Το 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" ως συνδυασμένο τύπο. Αυτό το στοιχείο έχει μια ιδιότητα που περιέχει άλλα στοιχεία, οπότε το θεωρούμε συνδυασμένο τύπο. Οι υποστοιχεία του στοιχείου "shiporder" περιλαμβάνονται μέσα στο στοιχείο xs:sequence, ορίζοντας τη σειρά των υποστοιχείων:

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

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

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

Αυτό είναι το κατάλογο του αρχείου σκευάσματος με το όνομα "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>

Διαίρεση του Σκευάσματος

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

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

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

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

Χρήση καθορισμένων τύπων (Ονομαστοί Τύποι)

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

Αυτό το αρχείο 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 的数字。