Esempio XML con XSD: alunno

Un esempio molto semplice introduttivo per comprendere l’uso di XML, dello XML Schema, il suo file XSD e delle regole quindi di validazione. Vogliamo provare ad inviare i dati relativi ad un alunno con banali informazioni anagrafiche. Un esempio potrebbe essere il seguente quindi. Trovi una guida di come creare un file XML anche qui sulle nostre pagine, mentre una valida guida alternativa, asciutta e sintetica sugli Schema XSD la trovate qui.

Esempio foglio dati di esempio XML

Il foglio xml è piuttosto semplice. Prevede solo un annidamento dentro il tag alunno. Ci sono tag che si riferiscono a dati testuali, numero, un carattere, un booleano. Proponiamo un esempio con dati per la successiva validazione.

<alunno>
  <cognome>Centinaro</cognome>
  <cognome>Rossi</cognome>
  <nome>Alfredo</nome>
  <anno>1982</anno>
  <sesso>M</sesso>
  <celibe>true</celibe>
</alunno>

Il file XSD ver.1

Partendo dal file XML, proviamo a costruire un foglio di schema XSD. In molti casi questa operazione potrebbe generare XSD differenti poiché prevede o meno determinate casistiche non immediatamente riscontrabili nel foglio dati. Vediamo una prima versione semplificata che ci porta però a fare qualche considerazione e qualche elemento più stringente.

Tolte le due righe di intestazione classiche che richiamano gli standard XML e XML Schema, il primo elemento è proprio alunno. In particolare poi questo non è un elemento secco singolo ma ha dei sotto elementi, come ci aspettiamo da un nodo radice del resto. Definiamo quindi il tag complexType che si apre e chiude, badate bene. Al suo interno i campi espressi non sono liberi ma ricadono in una sequenza ordinata che si aspetterà il parser che riceve il file dati.

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="alunno">
    <xs:complexType>
      <xs:sequence>

      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Le restanti voci sono elementi semplici, quindi possono essere classificati nello schema semplicemente con la voce singola element che possiamo chiude o con il tag </element> o col il semplice slash finale. Il file completo potrebbe quindi essere quello sotto riportato.

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="alunno">
    <xs:complexType>
      <xs:sequence>
    	<xs:element name="cognome" type="xs:string" />
      	<xs:element name="nome" type="xs:string" />
      	<xs:element name="anno" type="xs:positiveInteger" />
        <xs:element name="sesso" type="xs:string" />
      	<xs:element name="celibe" type="xs:boolean" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 </xs:schema>

Il file XSD ver.2

Se proviamo il nostro XML e XSD in un validatore online o notepad o visual studio code, il file sicuramente passa ma vogliamo renderlo un po’ più specifico ed accurato.

Ad esempio potrebbe capitare che un alunno abbia più cognomi. In questo caso possiamo utilizzare gli attributi minOccurs e maxOccurs che specificano il numero minimo e massimo, in questo caso, di cognomi che un xml può contenere. Se specifichiamo minimo zero, vuol dire che il tag è opzionale mentre sul limite max possiamo inserire il numero congruo che vogliamo o digitare unbounded che signica che nel xml possono essere riportati infiniti cognomi (qui sarebbe ragionevole mettere 2).

<xs:element name="cognome" type="xs:string" minOccurs="1" maxOccurs="unbounded" />

Anno vogliamo che sia un numero positivo, quindi invece di intero potrebbe essere più ragionevole type=”xs:positiveInteger”.

Sul sesso vogliamo essere certi che il dato che arriva a mezzo di XML sia di una sola lettera. Possiamo allora ridefinire il tag element con uno di apertura/chiusura e specificare al suo interno che è un tipo semplice ma con dei vincoli quindi inseriamo simpleType, restriction specificandoci il tipo e finalmente il tax maxLenght che ha valore 1 per indicar il singolo carattere ammesso.

        <xs:element name="sesso">
          <xs:simpleType>
          	<xs:restriction base="xs:string">
            	<xs:maxLength value="1" />
          	</xs:restriction>
          </xs:simpleType>
        </xs:element>

Quest’ultima parte complica un po’ il nostro schema ma come spesso accade, è una questione di esercitazione, abitudine e sapere dove cercare tra manuali ed esercizi svolti.

Il file XSD completo:

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="alunno">
    <xs:complexType>
      <xs:sequence>
    	<xs:element name="cognome" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
      	<xs:element name="nome" type="xs:string" />
      	<xs:element name="anno" type="xs:positiveInteger" />
        <xs:element name="sesso">
          <xs:simpleType>
          	<xs:restriction base="xs:string">
            	<xs:maxLength value="1" />
          	</xs:restriction>
          </xs:simpleType>
        </xs:element>
      	<xs:element name="celibe" type="xs:boolean" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 </xs:schema>

Ultima modifica 15 Gennaio 2025