XML Schema

L’XML Schema, meglio noto come linguaggio XSD, rappresenta un ulteriore strumento per la definizione della grammatica di un documento XML, a differenza del DTD esso offre un controllo più avanzato degli elementi inseribili all’interno dei documenti. Sappiamo ad esempio che utilizzando i DTD non è possibile specificare la tipologia dei dati inseribili all’interno di un attributo di un nodo (intero, stringa, ecc.) e neppure il numero esatto di elementi che possono essere inseriti all’interno di un dato nodo. Inoltre, a differenza del DTD che utilizza un suo linguaggio dedicato, XML Schema utilizza lo stesso linguaggio XML per definire una grammatica XML, questo aiuta a capire le infinite potenzialità del linguaggio in esame.

Secondo le regole imposte dallo standard ogni XML Schema si apre con un elemento root, rappresentato dal tag “schema” appartenente al namespace xs. Si veda il seguente esempio:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- Definizione della grammatica -->
</xs:schema>

Tipi di dato semplice

I tipi di dato rappresentano la grande novità offerta dagli XML Schema, il linguaggio offre infatti la possibilità di definire tipi di dato semplici e tipi di dato complessi. I tipi di dato semplici vengono utilizzati per rappresentare elementi che non contengono attributi o nidificazioni, al contrario, i tipi di dato complessi sono utilizzati nella definizione di elementi contenenti attributi oppure nidificazioni.

I tipi di dato semplice si differenziano a loro volta in tipi di dato predefiniti e personalizzati, di seguito elenchiamo alcuni tipi di dato predefiniti:

Tipo di dato Descrizione
integer Numero intero
decimal Numero decimale
boolean Valore booleano
string Stringa di caratteri
date Data (YYYY-MM-DD)
time Ora
uriReference Collegamento

Ad un più vasto elenco di tipi primitivi segue un insieme di tipi derivati built-in che comprende: int, long, short, byte, negativeInteger, nonNegativeInteger, unsignedInt, ecc… Negli XML Schema sarà ad esempio possibile definire un elemento “quantità” in grado di contenere unicamente dei valori di tipo intero.

<xs:element name="quantita" type="xs:integer"/>

Utilizzando questa notazione sarà possibile definire un valore predefinito, oppure un valore prefissato per uno specifico nodo XML.

<xs:element name="quantita" type="xs:integer" default="5"/>
<xs:element name="quantita" type="xs:integer" fixed="5"/>

Nel primo caso il valore assegnato sarà utilizzato nel caso in cui non saranno specificati altri valori, nel secondo caso invece non sarà possibile esprimere un valore diverso da quello indicato.

Restrizioni sul valore

All’interno degli XML Schema è possibile definire dei tipi di dati personalizzati a partire dai tipi semplici nativi, modificando ad esempio l’intervallo dei valori accettabili, queste “restrizioni sul valore” sono anche dette XSD Facets. Di seguito definiamo un elemento “quantità” in grado di accettare valori interi compresi tra 0 e 120 (inclusi).

<xs:element name="quantita">
  <xs:simpleType>
    <xs:restriction base="xs:integer"> <!-- il tipo si basa su una restrizione sul tipo intero -->
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element/>

Restrizioni sul set di valori

È inoltre possibile esprimere un insieme finito di valori accettabili all’interno di un nodo. Ad esempio, l’elemento “colore” potrà contenere solamente uno dei valori: ‘rosso’ o ‘verde’.

<xs:element name="colore">
  <xs:simpleType>
    <xs:restriction base="xs:string"> <!-- il tipo si basa su una restrizione sul tipo stringa -->
      <xs:enumeration value="rosso"/>
      <xs:enumeration value="verde"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
<!-- oppure -->
<xs:simpleType name="colorType">
  <xs:restriction base="xs:string"> <!-- il tipo si basa su una restrizione sul tipo stringa -->
      <xs:enumeration value="rosso"/>
      <xs:enumeration value="verde"/>
  </xs:restriction>
</xs:simpleType>
<xs:element name="colore" type="colorType"/>

La seconda notazione prevede la dichiarazione di un tipo colorType, basato su una restrizione del tipo string, che potrà essere utilizzato all’interno dei diversi elementi componenti il nostro documento XML.

Restrizioni con espressioni regolari

Utilizzando gli XML Schema è possibile esprimere il valore accettato da un nodo XML mediante l’utilizzo di espressioni regolari. Ad esempio il seguente tipo semplice “letter” permetterà l’inserimento di una sola lettera minuscola compresa tra ‘a’ e ‘z’:

<xs:simpleType name="letterType">
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-z]"/>
  </xs:restriction>
</xs:simpleType>

Elementi del seguente tipo semplice “initials” potranno invece contenere unicamente una sequenza finita di due lettere maiuscole:

<xs:simpleType name="initialsType">
  <xs:restriction base="xs:string">
    <xs:pattern value="[A-Z][A-Z]"/>
  </xs:restriction>
</xs:simpleType>

Altri esempi simili:

  • [a-zA-Z], una lettera maiuscola o minuscola;
  • [cde], una lettera minuscola a scelta tra ‘c’, ‘d’ o ‘e’;
  • [0-9], un numero compreso tra 0 a 9 (inclusi);
  • [a-ZA-Z0-9], un qualsiasi valore alfanumerico.

Sono inoltre accettate espressioni regolari più complesse, ad esempio il seguente tipo “word” permetterà l’inserimento di una stringa alfabetica di lunghezza arbitraria:

<xs:simpleType name="wordType">
  <xs:restriction base="xs:string">
    <xs:pattern value="([a-zA-Z])*"/> <!-- zero o più caratteri alfanumerici -->
  </xs:restriction>
</xs:simpleType>

Il seguente tipo semplice “wordFix” permette l’inserimento di una stringa alfabetica formata da esattamente 8 lettere:

<xs:simpleType name="wordFixType">
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-zA-Z]{8}"/> <!-- 8 caratteri alfabetici -->
  </xs:restriction>
</xs:simpleType>

Il seguente tipo “gender” permette l’inserimento del valore ‘maschio’ o del valore ‘femmina’:

<xs:simpleType name="genderType">
  <xs:restriction base="xs:string">
    <xs:pattern value="maschio|femmina"/>
  </xs:restriction>
</xs:simpleType>

Restrizioni sulla lunghezza

Utilizzano gli XML Schema è possibile vincolare il contenuto di un nodo specificando alcuni vincoli sulla lunghezza del testo in esso contenuto, le proprietà utilizzabili a questo scopo sono: length, maxLength e minLength.

<xs:simpleType name=''customTextType>
  <xs:restriction base="xs:string">
    <xs:pattern value="([a-z])+"/>
    <xs:minLenght value="2"/>
    <xs:maxLenght value="50"/>
  </xs:restriction>
</xs:simpleType>

Restrizioni sugli spazi

In ultimo è possibile definire il comportamento dell’XML Processor alla presenza del carattere di spazio (‘ ‘). Il seguente esempio mostra la creazione di un tipo semplice “address” caratterizzato dalla proprietà whiteSpace a cui è assegnata il valore ‘preserve’.

<xs:simpleType name="addressType">
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="preserve"/>
  </xs:restriction>
</xs:simpleType>

Utilizzando la proprietà whiteSpace con valore ‘replace’ si otterrà la sostituzione dei caratteri di tabulazione, avanzamento di riga e a capo, con degli spazi. Infine, utilizzando la proprietà whiteSpace con valore ‘collapse’ si otterrà la sostituzione degli spazi multipli con un singolo spazio.

Tabella riassuntiva

Tabella riassuntiva dei vincoli esprimibili con i tipi semplici.

Proprietà Valore
enumeration Contiene una lista di valori accettabili
fractionDigits Specifica la dimensione massima della parte decimale di un numero. Deve essere maggiore o uguale a zero
length Specifica la lunghezza esatta del dato accettato in input. Deve essere maggiore o uguale a zero
maxExclusive Specifica un limite superiore per un valore numerico. Il valore inserito deve essere minore di questo vincolo
maxInclusive Specifica un limite superiore per un valore numerico. Il valore inserito deve essere minore o uguale di questo vincolo
maxLength Specifica la dimensione massima del dato accettato in input. Deve essere maggiore o uguale a zero
minExclusive Specifica un limite inferire per un valore numerico. Il valore inserito deve essere maggiore di questo vincolo
minInclusive Specifica un limite inferiore per un valore numerico. Il valore inserito deve essere maggiore o uguale di questo vincolo
minLength Specifica la dimensione minima del dato accettato in input. Deve essere maggiore o uguale a zero
pattern Specifica una sequenza di caratteri accettati in input.
totalDigits Specifica il numero esatto di cifre numeriche accettate. Deve essere maggiore di zero
SwhiteSpace Definisce il comportamento da tenere con gli spazi bianchi