xml schema (xsd)
TRANSCRIPT
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
DEMOValidiamo 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 xmaxOccurs da 1 a unboundeddefault 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)