XML Schema (XSD)

Post on 09-Jul-2015

970 views 5 download

Transcript of XML Schema (XSD)

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