XML-Schema


    Eidon School
Agenda
 Introduzione e richiami formali
 Più in dettaglio
 Esempi

 PAUSA

 Esercitazione con l’aiuto di xmllint
 Esercitazione con l’aiuto di carta e penna
 Controllo del'esercitazione con xmllint
XSL-Schema
 Raccomandazione del W3C (1.0 del maggio
  2001, 1.1 è candidate racommendation)
 È uno linguaggio XML like (primo a
  raggiungere la W3C recommendation) per
  validare un documento XML
 Validare un documento XML significa
  verificare che è conforme ai requisiti richiesti
  dallo schema (presenza/assenza di nodi e
  restrizioni sui tipi di dati presenti)
 Viene usato anche per documentazione
Nomenclatura
 Esistono diversi XML schema con cui
  validare:
   W3C XML Schema o semplicemente XML
    Schema (o anche WXS o XSD, notale la “S” in
    grande di schema) usato in questa sede
   Relax NG (REgular LAnguage for XML Next Generation)
   Schematron
   XML-Data Reduced (XDR) di Microsoft
   altri minori
DEMO
Validiamo il nostro file XML

xmllint --schema Elenco.xsd Elenco.xml
Annotations
 Documentazione
 Istruzioni al sistema


<xs:annotation>
      <xs:documentation xml:lang="it-IT">
            Nodo Radice
      </xs:documentation>
      <xs:appinfo>root-node</xs:appinfo>
</xs:annotation>
Dichiarazione di un elemento
 È la tipica dichiarazione di un elemento che
  contiene testo (o un tipo specificato in type)

<xs:element name="fullName" type="xs:string">
Tipi di dati (alcuni) 1/2
 boolean
 byte
 dateTime
 integer
 string
 language
Tipi di dati 2/2
 E’ possibile aumentare i tipi di dato unendo o
  restringendo i tipi base:

<xs:restriction base="xs:string">
      <xs:enumeration value="casa"/>
      <xs:enumeration value="ufficio"/>
</xs:restriction>
Definizioni di tipo
 la definizione di un elemento o di un attributo
  avviene definendo un ComplexType o un
  SimpleType
 la definizione può avvenire globalmente
  (inserendo il tipo sotto la radice dello
  schema) e dandogli un nome con cui riferirlo,
  o dichiararlo inline senza nome (viene
  utilizzato solo una volta)
 Vedi il SimpleType scontoType
  nell’Esempio.xsd
SimpleType e ComplexType
 Un elemento che non contiene sotto elementi
  né attributi può essere definito attraverso un
  SimpleType, altrimenti occorre usare un
  ComplexType.
 Gli attributi sono sempre SimpleType
 Vedi Indirizzo nel file di esempio.
Occorrenze
La dichiarazione di un element prevede un
limite al numero di occorrenze di un elemento:

minOccurs  da 0 a x
maxOccurs  da 1 a unbounded
default per entrambi è 1

<xs:element name="record"
               maxOccurs="unbounded">
Il contenuto degli elementi
 Un elemento può contenere:
   altri elementi
   essere vuoto
   contenere semplicemente testo
   essere a contenuto misto (mixed content, vi
    ricordare il seminario XML…???)
   non definito
Elementi vuoti (Empty)
 A cosa servono?
   marcatori di posizione
   presenza/assenza
   contenitori di attributi



  Esempio di elemento vuoto e opzionale:
  <xs:element name="preferito" minOccurs="0">
    <xs:complexType/>
  </xs:element>
Elementi con solo testo
 Hanno un contenuto di tipo semplice
  (simpleContent) e adottano come tipi base
  quelli definiti dallo schema con la possibilità
  di ridefinirli con un meccanisco chiamato
  Facets.
 Controlli possibili: length, minLength,
  maxLength, pattern, enumeration,
  whiteSpace, maxInclusive, maxExclusive,
  minInclusive, minExclusive …
Limitare la lunghezza (Facet)
<xs:simpleType name="nomeType">
  <xs:restriction base="xs:string">
  <xs:maxLength value="50"/>
  </xs:restriction>
</xs:simpleType>
Enumerare (Facet)
<xs:simpleType name="locationType">
  <xs:restriction base="xs:string">
  <xs:enumeration value="work"/>
  <xs:enumeration value="home"/>
  <xs:enumeration value="mobile"/>
  </xs:restriction>
</xs:simpleType>
Espressioni regolari (Facet)
<xs:simpleType name=“indirizzowebType">
   <xs:restriction base="xs:string">
        <xs:pattern value="(http|https|ftp)://(((((([0-1])?
   ([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-
   9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?
   [0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?[0-
   9])|(2[0-4][0-9])|(2[0-5][0-5]))))|((([a-z0-9-])+.)+([a-z]
   {2}.[a-z]{2}|[a-z]{2,4})))"/>
   </xs:restriction>
</xs:simpleType>
Elemento contenente altri elementi
 E’ di tipo complesso e definisce altri elementi
  che possono apparire come figli attraverso:
 xs:sequence  i figli devono apparire
  nell’ordine specificato
 xs:choice  deve essere presente uno e solo
  uno dei figli descritti
 xs:any  i figli possono apparire una e una
  solo volta in qualunque ordine
Qualunque contenuto
 E’ necessario a volte poter far includere
  qualunque cosa dentro un elemento (es:
  rendering di XHTML):
   xs:any
   xs:anyAttribute
Univocità dei campi

<xs:unique name="codice_cliente_unique">
      <xs:selector xpath="record"/>
      <xs:field xpath="codice_cliente"/>
</xs:unique>
ESERCITAZIONI
Numeri
 Arricurarsi che il codice cliente sia un numero
  da 1 a 9999.

…<codice_cliente>5</codice_cliente>…

Suggerimento: xs:restriction,
  xs:minInclusive, xs:maxInclusive
Soluzione
<xs:element name="codice_cliente">
  <xs:simpleType>
      <xs:restriction base="xs:short">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="9999"/>
      </xs:restriction>
  </xs:simpleType>
</xs:element>
Testo
 Limitare l’attributo tipo di indirizzo a “casa” e
  “ufficio”

 Suggerimento: xs:restriction e
  xs:enumeration
Soluzione
<xs:attribute name="tipo" use="required">
  <xs:simpleType>
      <xs:restriction base="xs:string">
             <xs:enumeration value="casa"/>
             <xs:enumeration value="ufficio"/>
      </xs:restriction>
  </xs:simpleType>
</xs:attribute>
Formato string
 Rendere obbligatorio che il codice_fiscale
  inizi con “IT…”

 Suggerimento: regex ‘IT.*’
Soluzione
<xs:element name="codice_fiscale">
  <xs:simpleType>
      <xs:restriction base="xs:string">
            <xs:pattern value="IT.*"/>
      </xs:restriction>
  </xs:simpleType>
</xs:element>
Tag obbligatorio
 Rendere obbligatorio il tag sconto di record
Soluzione
<xs:element name="sconto" type="scontoType"
  minOccurs="0"/>
Univocita del codice_cliente
 Inserire nel file XSD il controllo dell’univocità
  del campo codice_cliente dell’elemento
  record.

 Suggerimento: xs:unique
Soluzione
<xs:element name="anagrafica">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="testata">
        ...
    </xs:element>
    <xs:element name="record" maxOccurs="unbounded">
        ....
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="codice_cliente_unique">
     <xs:selector xpath="record"/>
     <xs:field xpath="codice_cliente"/>
   </xs:unique>
…
Dichiarazioni di tipi globali
 Rendere globale il tipo definito in linea per
  codice_fiscale
Soluzione
  <xs:simpleType name="scontoType">
      <xs:restriction base="xs:string">
            <xs:enumeration value="si"/>
            <xs:enumeration value="no"/>
      </xs:restriction>
  </xs:simpleType>
…
<xs:element name="codice_fiscale"
  type="codicefiscaleType"/>
Key e KeyRef
Riferimenti
http://www.w3.org/TR/xmlschema-0/
http://www.w3.org/TR/xmlschema-1/
http://www.w3.org/TR/xmlschema-2/
XML in a Nutshell, Third Edition by Elliotte
  Rusty Harold and W. Scott Means
  (Paperback - Sep 23, 2004)

XML Schema (XSD)

  • 1.
    XML-Schema Eidon School
  • 2.
    Agenda  Introduzione erichiami formali  Più in dettaglio  Esempi  PAUSA  Esercitazione con l’aiuto di xmllint  Esercitazione con l’aiuto di carta e penna  Controllo del'esercitazione con xmllint
  • 3.
    XSL-Schema  Raccomandazione delW3C (1.0 del maggio 2001, 1.1 è candidate racommendation)  È uno linguaggio XML like (primo a raggiungere la W3C recommendation) per validare un documento XML  Validare un documento XML significa verificare che è conforme ai requisiti richiesti dallo schema (presenza/assenza di nodi e restrizioni sui tipi di dati presenti)  Viene usato anche per documentazione
  • 4.
    Nomenclatura  Esistono diversiXML schema con cui validare:  W3C XML Schema o semplicemente XML Schema (o anche WXS o XSD, notale la “S” in grande di schema) usato in questa sede  Relax NG (REgular LAnguage for XML Next Generation)  Schematron  XML-Data Reduced (XDR) di Microsoft  altri minori
  • 5.
    DEMO Validiamo il nostrofile XML xmllint --schema Elenco.xsd Elenco.xml
  • 6.
    Annotations  Documentazione  Istruzionial sistema <xs:annotation> <xs:documentation xml:lang="it-IT"> Nodo Radice </xs:documentation> <xs:appinfo>root-node</xs:appinfo> </xs:annotation>
  • 7.
    Dichiarazione di unelemento  È la tipica dichiarazione di un elemento che contiene testo (o un tipo specificato in type) <xs:element name="fullName" type="xs:string">
  • 8.
    Tipi di dati(alcuni) 1/2  boolean  byte  dateTime  integer  string  language
  • 9.
    Tipi di dati2/2  E’ possibile aumentare i tipi di dato unendo o restringendo i tipi base: <xs:restriction base="xs:string"> <xs:enumeration value="casa"/> <xs:enumeration value="ufficio"/> </xs:restriction>
  • 10.
    Definizioni di tipo la definizione di un elemento o di un attributo avviene definendo un ComplexType o un SimpleType  la definizione può avvenire globalmente (inserendo il tipo sotto la radice dello schema) e dandogli un nome con cui riferirlo, o dichiararlo inline senza nome (viene utilizzato solo una volta)  Vedi il SimpleType scontoType nell’Esempio.xsd
  • 11.
    SimpleType e ComplexType Un elemento che non contiene sotto elementi né attributi può essere definito attraverso un SimpleType, altrimenti occorre usare un ComplexType.  Gli attributi sono sempre SimpleType  Vedi Indirizzo nel file di esempio.
  • 12.
    Occorrenze La dichiarazione diun element prevede un limite al numero di occorrenze di un elemento: minOccurs  da 0 a x maxOccurs  da 1 a unbounded default per entrambi è 1 <xs:element name="record" maxOccurs="unbounded">
  • 13.
    Il contenuto deglielementi  Un elemento può contenere:  altri elementi  essere vuoto  contenere semplicemente testo  essere a contenuto misto (mixed content, vi ricordare il seminario XML…???)  non definito
  • 14.
    Elementi vuoti (Empty) A cosa servono?  marcatori di posizione  presenza/assenza  contenitori di attributi Esempio di elemento vuoto e opzionale: <xs:element name="preferito" minOccurs="0"> <xs:complexType/> </xs:element>
  • 15.
    Elementi con solotesto  Hanno un contenuto di tipo semplice (simpleContent) e adottano come tipi base quelli definiti dallo schema con la possibilità di ridefinirli con un meccanisco chiamato Facets.  Controlli possibili: length, minLength, maxLength, pattern, enumeration, whiteSpace, maxInclusive, maxExclusive, minInclusive, minExclusive …
  • 16.
    Limitare la lunghezza(Facet) <xs:simpleType name="nomeType"> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType>
  • 17.
    Enumerare (Facet) <xs:simpleType name="locationType"> <xs:restriction base="xs:string"> <xs:enumeration value="work"/> <xs:enumeration value="home"/> <xs:enumeration value="mobile"/> </xs:restriction> </xs:simpleType>
  • 18.
    Espressioni regolari (Facet) <xs:simpleTypename=“indirizzowebType"> <xs:restriction base="xs:string"> <xs:pattern value="(http|https|ftp)://(((((([0-1])? ([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0- 9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])? [0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?[0- 9])|(2[0-4][0-9])|(2[0-5][0-5]))))|((([a-z0-9-])+.)+([a-z] {2}.[a-z]{2}|[a-z]{2,4})))"/> </xs:restriction> </xs:simpleType>
  • 19.
    Elemento contenente altrielementi  E’ di tipo complesso e definisce altri elementi che possono apparire come figli attraverso:  xs:sequence  i figli devono apparire nell’ordine specificato  xs:choice  deve essere presente uno e solo uno dei figli descritti  xs:any  i figli possono apparire una e una solo volta in qualunque ordine
  • 20.
    Qualunque contenuto  E’necessario a volte poter far includere qualunque cosa dentro un elemento (es: rendering di XHTML):  xs:any  xs:anyAttribute
  • 21.
    Univocità dei campi <xs:uniquename="codice_cliente_unique"> <xs:selector xpath="record"/> <xs:field xpath="codice_cliente"/> </xs:unique>
  • 22.
  • 23.
    Numeri  Arricurarsi cheil codice cliente sia un numero da 1 a 9999. …<codice_cliente>5</codice_cliente>… Suggerimento: xs:restriction, xs:minInclusive, xs:maxInclusive
  • 24.
    Soluzione <xs:element name="codice_cliente"> <xs:simpleType> <xs:restriction base="xs:short"> <xs:minInclusive value="1"/> <xs:maxInclusive value="9999"/> </xs:restriction> </xs:simpleType> </xs:element>
  • 25.
    Testo  Limitare l’attributotipo di indirizzo a “casa” e “ufficio”  Suggerimento: xs:restriction e xs:enumeration
  • 26.
    Soluzione <xs:attribute name="tipo" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="casa"/> <xs:enumeration value="ufficio"/> </xs:restriction> </xs:simpleType> </xs:attribute>
  • 27.
    Formato string  Rendereobbligatorio che il codice_fiscale inizi con “IT…”  Suggerimento: regex ‘IT.*’
  • 28.
    Soluzione <xs:element name="codice_fiscale"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="IT.*"/> </xs:restriction> </xs:simpleType> </xs:element>
  • 29.
    Tag obbligatorio  Rendereobbligatorio il tag sconto di record
  • 30.
  • 31.
    Univocita del codice_cliente Inserire nel file XSD il controllo dell’univocità del campo codice_cliente dell’elemento record.  Suggerimento: xs:unique
  • 32.
    Soluzione <xs:element name="anagrafica"> <xs:complexType> <xs:sequence> <xs:element name="testata"> ... </xs:element> <xs:element name="record" maxOccurs="unbounded"> .... </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="codice_cliente_unique"> <xs:selector xpath="record"/> <xs:field xpath="codice_cliente"/> </xs:unique> …
  • 33.
    Dichiarazioni di tipiglobali  Rendere globale il tipo definito in linea per codice_fiscale
  • 34.
    Soluzione <xs:simpleTypename="scontoType"> <xs:restriction base="xs:string"> <xs:enumeration value="si"/> <xs:enumeration value="no"/> </xs:restriction> </xs:simpleType> … <xs:element name="codice_fiscale" type="codicefiscaleType"/>
  • 35.
  • 36.
    Riferimenti http://www.w3.org/TR/xmlschema-0/ http://www.w3.org/TR/xmlschema-1/ http://www.w3.org/TR/xmlschema-2/ XML in aNutshell, Third Edition by Elliotte Rusty Harold and W. Scott Means (Paperback - Sep 23, 2004)