Un esempio di XSD

Questa sezione vi mostrerà come scrivere un XML Schema. Apprenderete anche diversi metodi per scrivere schema.

Documento XML

Vediamo questo documento XML chiamato "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>

Il documento XML sopra include l'elemento radice "shiporder", che contiene un attributo necessario chiamato "orderid". L'elemento "shiporder" contiene tre diversi elementi figli: "orderperson", "shipto" e "item". L'elemento "item" appare due volte, contiene un elemento "title", un elemento facoltativo "note", un elemento "quantity" e un elemento "price".

Questa riga xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" informa all'analizzatore XML di verificare questo documento in base a un certaine schema. Questa riga: xsi:noNamespaceSchemaLocation="shiporder.xsd" specifica la posizione dello schema (qui, è nello stesso percorso di "shiporder.xml").

Creare uno XML Schema

Ora, dobbiamo creare uno schema per il documento XML sopra menzionato.

Possiamo iniziare aprendo un nuovo file e chiamarlo "shiporder.xsd". Per creare lo schema, dobbiamo semplicemente seguire la struttura del documento XML, definendo ogni elemento che troviamo. Iniziamo con una dichiarazione XML standard:

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

Nello schema sopra, abbiamo utilizzato lo spazio dei nomi standard (xs), che è associato all'URI del linguaggio di definizione dello schema (Schema language definition), il cui valore standard è http://www.w3.org/2001/XMLSchema.

Prossimamente, dobbiamo definire l'elemento "shiporder". Questo elemento ha un attributo che contiene altri elementi, quindi lo consideriamo un tipo complesso. Gli elementi figli dell'elemento "shiporder" sono racchiusi dall'elemento xs:sequence, che definisce l'ordine dei figli:

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

Poi dobbiamo definire l'elemento "orderperson" come tipo semplice (poiché non contiene alcun attributo o altri elementi). Il prefisso del tipo (xs:string) è determinato dal prefisso dello spazio dei nomi, che è associato all'XML schema che indica i tipi di dati schema predefiniti:

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

Prossimamente, devo definire due elementi come tipo complesso: "shipto" e "item". Iniziamo con la definizione dell'elemento "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>

Tramite lo schema, possiamo utilizzare gli attributi maxOccurs e minOccurs per definire il numero di volte che un elemento può apparire. maxOccurs definisce il numero massimo di volte che un elemento può apparire, mentre minOccurs definisce il numero minimo di volte che un elemento può apparire. Il valore predefinito per entrambi è 1!

Ora, possiamo definire l'elemento "item". Questo elemento può apparire più volte all'interno dell'elemento "shiporder". Questo è possibile impostando il valore dell'attributo maxOccurs dell'elemento "item" su "unbounded", in modo che l'elemento "item" possa apparire quante volte desiderato dal creatore. Attenzione, l'elemento "note" è un elemento opzionale. Abbiamo impostato l'attributo minOccurs di questo elemento su 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>

Ora, possiamo dichiarare gli attributi dell'elemento "shiporder". Poiché è un attributo obbligatorio, stabiliamo use="richiesto".

Commento:La dichiarazione di questo attributo deve essere messa all'ultimo:

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

Questa è la lista dei documenti di questo file schema chiamato "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>

Dividere lo Schema

Il metodo di progettazione precedente è molto semplice, ma diventa difficile da leggere e mantenere quando i documenti sono complessi.

Il metodo di progettazione presentato di seguito si basa innanzitutto sulla definizione di tutti gli elementi e attributi, e poi utilizza l'attributo ref per riferirsi a loro.

Questo schema è stato progettato utilizzando un nuovo metodo:

<?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"/>
<!-- Definizione degli attributi -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- Definizione dell'elemento complesso -->
<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>

Utilizzo dei tipi specificati (Tipi Nomeati)

Il metodo di progettazione terzo definisce classi o tipi, permettendoci di riutilizzare le definizioni degli elementi. Il modo specifico è: prima nomare gli elementi semplici e complessi, quindi puntare a loro attraverso l'attributo type degli elementi.

Questo schema è stato progettato utilizzando il terzo metodo (file "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>

L'elemento 'restriction' mostra che il tipo di dati è derivato dallo spazio dei nomi del tipo di dati W3C XML Schema. Pertanto, il seguente frammento significa che il valore dell'elemento o dell'attributo deve essere di tipo stringa:

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

L'elemento di restrizione viene spesso utilizzato per applicare limitazioni agli elementi. Ecco alcuni frammenti provenienti dallo schema sopra menzionato:

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

Questo codice indica che il valore dell'elemento o dell'attributo deve essere una stringa e deve essere composta da sei caratteri consecutivi, e questi caratteri devono essere numeri da 0 a 9.