一个 XSD 实例

Questa sezione vi mostrerà come scrivere uno schema XML. Apprenderete anche diverse metodologie per scrivere schema.

Documento XML

Ecco come si presenta il 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 superiore include l'elemento radice "shiporder", che contiene un attributo obbligatorio chiamato "orderid". L'elemento "shiporder" contiene tre diversi elementi figli: "orderperson", "shipto" e "item". L'elemento "item" appare due volte, contiene un "title", un elemento opzionale "note", un "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.

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 identifichiamo come tipo composto. 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 composto: "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 maxOccurs e minOccurs è 1!

Ora, possiamo definire l'elemento "item". Questo elemento può apparire più volte all'interno dell'elemento "shiporder". Questo è realizzato impostando il valore dell'attributo maxOccurs dell'elemento "item" su "unbounded", in modo che l'elemento "item" possa apparire quante volte il creatore desidera. Si prega di notare che 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, regoliamo use="required".

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

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

Ecco l'elenco 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 prima sulla definizione di tutti gli elementi e gli attributi, e poi sull'uso dell'attributo ref per referenziarli.

Questo file 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">
<!-- Definizione dell'elemento semplice -->
<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 (Named Types)

Il terzo metodo di progettazione definisce classi o tipi, permettendoci di riutilizzare le definizioni degli elementi. Il modo specifico è: prima dare un nome agli elementi semplici e complessi, quindi utilizzare l'attributo type degli elementi per puntare a loro.

Questo schema è stato progettato utilizzando il terzo metodo ("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 di restrizione mostra che il tipo di dati deriva 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 limiti agli elementi. Vediamo alcuni frammenti provenienti dallo schema sopra riportato:

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

这段代码指示出,元素或属性的值必须为字符串,并且必须是连续的六个字符,同时这些字符必须是 0-9 的数字。