Share |

venerdì 19 marzo 2010

XSD: Definire elementi Simple Type

In questo articolo riguardante il capitolo XSD cercherò di chiarire cos'è un elemento Simple Type e come è strutturato in modo tale da saperne fornire la dichiarazione XSD.

A volte, definire un tipo di dati di un elemento come 'stringa' o 'intero' potrebbe non essere sufficiente: infatti potremmo voler restringere ad un determinato range, per esempio, i valori numerici di un elemento XSD.

Tutte queste necessità possono essere definite all'interno di un XSD_Schema tramite il linguaggio XSD.

I Simple Type elements comprendono le seguenti categorie:

  • elementi semplici;
  • attributi;
  • restrizioni o facets;

Simple Type

Un Simple Type è un elemento XML, privo di attributi, che contiene solo testo (quindi totale assenza di ulteriori nodi figlio o child nodes).

La sintassi di base per la definizione di un Simple Type e':

<xs:element name="xxx" type="xxx" />

L'attributo name rappresenta il nome dell'elemento, mentre type indica il tipo dei dati in esso contenuti.

Il linguaggio XSD dispone di diversi tipi di dati predefiniti o build in, i più comunemente utilizzati sono:

Tipi di dati Predefiniti
TipoDescrizione
stringStringhe di caratteri
decimalValori numerici generici
integerValori numerici interi
booleanValori booleani: true o false
dateDate
timeOrari

Quindi, per esempio, potremo definire un Simple Type in questa maniera:

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

Che corrisponderebbe ad un elemento XML di questo tipo:

<nome>Mirko</nome>

Gli elementi semplici possono avere un valore di default che viene assegnato in mancanza di quello dato:

<xs:element name="nome" 
    default="Senza Nome" type="xs:string" />

Oppure possono avere un valore fixed che viene assegnato sempre.

Da ricordare che fixed e default si escludono a vicenda:

<xs:element name="home" 
       fixed="http://mirkoagrati.blogspot.com" 
       type="xs:string" />

Gli Attributi

Se un elemento contiene attributi, per definizione, diventerà necessariamente un Complex Type o Tipo complesso.

Tuttavia gli attributi XSD rientrano nella sfera dei Simple Type: infatti la sintassi per definire un attributo ha molte similitudini con quella per definire un elemento semplice:

<xs:attribute name="xxx" type="xxx" />

E come gli elementi semplici, anche gli attributi possono avere la definizione di fixed o default.

In aggiunta, gli attributi definiti dallo schema, per natura, sono opzionali ovvero anche se presenti nello schema_XSD possono risultare mancanti nel documento XML, a meno che non siano dichiarati con l'attributo use impostato a require: questo é l'unico modo per rendere un attributo obbligatorio.
Per esempio:

<xs:attribute name="id" 
    use="require" type="xs:string" />

Restrizioni o Facets

A volte potremmo voler restringere ad un determinato range, per esempio, i valori numerici di un elemento XSD.

E' per questo che ai tipi_di_base_XSD possono essere applicate ulteriori restrizioni o facets.

Per esempio:
Vorremmo poter esprimere un elemento stringa che non contenga più di 20 caratteri.

Come fare?
Grazie a questa feature potremmo validare una stringa in questa maniera:

<xs:element name="cognome"> 
      <xs:simpleType> 
      
         <xs:restriction base="xs:string"> 
            <xs:minLength value="0"/> 
            <xs:maxLength value="20"/> 
         </xs:restriction> 
      
      </xs:simpleType> 
   </xs:element>

Ovviamente, se fosse necessario utilizzare una facet in più elementi conviene allora definirla esternamente, in modo da condividerla con tutti gli elementi e attributi che devono utilizzarla:

<xs:simpleType name="limitedStr"> 
      <xs:restriction base="xs:string"> 
         <xs:minLength value="0"/> 
         <xs:maxLength value="20"/> 
      </xs:restriction> 
   </xs:simpleType>

A questo punto basta assegnare all'attributo type di ogni elemento che necessita di limitazioni il nuovo tipo limitedStr:

<xs:element name="cognome" type="limitedStr" />

La tabella seguente riassume i tipi di restrizioni che il linguaggio XSD fornisce:

Facets Utilizzabili
Restrizione Descrizione
enumeration Lista di valori
fractionDigits Numero massimo di decimali
length Numero esatto di caratteri
maxExclusive Il valore numerico deve essere inferiore a quello specificato
maxInclusive Il valore numerico deve essere inferiore o uguale a quello specificato
maxLength Numero massimo di caratteri ammessi
minExclusive Il valore numerico deve essere superiore a quello specificato
minInclusive Il valore numerico deve essere superiore o uguale a quello specificato
minLength Numero minimo di caratteri ammessi
pattern Sequenza di caratteri ammessi (regular expressions)
totalDigits Numero di cifre ammesse
whiteSpace Specifica come gestire gli spazi bianchi

Ciò che è stato esposto in questo articolo risulta essere sicuramente importante per una definizione accurata delle tipologie di dati complesse che si vorranno creare a partire dalla loro definizione XSD.

Alla prossima,
MA.

0 commenti:

Posta un commento

Non ti è chiaro qualcosa?
No problem, posta il tuo dubbio ;)

..... e ricordati di firmarlo!