XML: XML Schema - Dipartimento di Scienze Ambientali, Informatica
Transcript
XML: XML Schema - Dipartimento di Scienze Ambientali, Informatica
XML: XML Schema Uno XML Schema è un documento XML che descrive la grammatica di un linguaggio XML utilizzando un linguaggio di markup specifico. In quanto documento XML, uno XML Schema ha un root element che contiene tutte le regole di definizione della grammatica. XML Schema prevede la possibilità di rendere modulare la definizione della struttura di un documento XML tramite la dichiarazione di tipi e di elementi. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Analogamente a quanto avviene con i DTD è possibile validare un documento rispetto ad un particolare schema. Gli schemi XML prevedono la possibilità di creare dei modelli dati fortemente tipati ( C, Java,DDL SQL) e sono compatibili con i namespace. Non sono sostitutivi dei DTD, ma i due sistemi devono/possono essere utilizzati in concomitanza ( in XML Schema non è possibile definire le entità) Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema In generale per i documenti scambiati tra utenti è preferibile utilizzare ancora i DTD, in altri casi invece (strutture dati o basi di dati) XML Schema L'impiego degli schemi in fase di validazione è molto più dispendioso, in termini di risorse computazionali, rispetto ai DTD. Nella pratica, non sempre si attua la validazione di un documento XML al fine di risparmiare risorse computazionali. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema In particolare quindi un XML Schema: ● ● definisce gli elementi che possono essere presenti in un documento definisce gli attributi che possono essere presenti in un documento ● definisce quali elementi sono elementi figlio ● definisce l'ordine degli elementi figlio ● definisce il numero degli elementi figlio ● definisce se un elemento è vuoto o possa contiene del testo ● definisce i tipi di dati per elementi ed attributi ● definisce i valori di default o prefissati per elementi ed attributi Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Inoltre un XML Schema: ● È estensibile ● È più ricco di contenuti e più potente rispetto al DTD ● È scritto in XML ● Supporta i tipi di dati ● Supporta i NAMESPACE Per queste ragioni gli schemi sono considerati i successori dei DTD e destinati ad essere utilizzati sempre maggiormente W3C Recommendation del 2 Maggio 2001 Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Gli Schemi XML sono estensibili proprio perché scritti in XML e quindi è possibile: ● ● ● Riutilizzare uno Schema in altri Schemi Creare tipi di dati personalizzati derivati dai tipi di dati standard Utilizzare vari schemi all'interno dello stesso documento XML Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Con il supporto per i tipi di dati: ● è più semplice descrivere i contenuti ammissibili ● è più semplice verificare la correttezza dei dati ● ● ● ● è più semplice lavorare con dati provenienti da basi di dati è più semplice definire delle restrizioni sui dati (data facets) è più semplice definire formati dei dati (data patterns) è più semplice convertire dati di diverso tipo Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Permette una comunicazione consistente dei documenti: "03-11-2007" potrebbe essere interpretato come il 3 Novembre oppure l'11 Marzo dipendentemente dal formato data adottato. In XML Schema una definizione del tipo <date type="date">2007-03-11</date> assicura che non cim siano dubbi nell'interpretazione in quanto il tipo data XML "date" utilizza il formato "AAAA-MM-DD". Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... Definizione dello schema ... </xs:schema> L'elemento root del documento è rappresentato dal tag <xs:schema>. Esso indica al parser che in questo documento saranno utilizzati dei tag definiti dal namespace standard del W3C per XML Schema indicato all'URI: http://www.w3.org/2001/XMLSchema Per il momento considereremo i NAMESPACE un meccanismo per identificare tag appartenenti ad una specifica grammatica. Nel nostro caso questi tag speciali sono caratterizzati dal prefisso xs: Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema XML Schema prevede il tag <xs:element> per la definizione degli elementi utilizzabili in un documento XML, specificando nell'attributo name il nome del tag relativo. In ogni tag <xs:element> si indica il tipo di dato dell'elemento e se ne definiscono gli eventuali attributi. Ad esempio, qui si specifica che l'elemento testo può contenere soltanto valori di tipo stringa: <xs:element name="testo" type="xs:string" /> Questa dichiarazione corrisponde alla seguente dichiarazione DTD: <!ELEMENT testo (#PCDATA)> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Per associare un documento (più propriamente detto un'istanza di schema) al proprio schema si utilizzano degli attributi associati al namespace XSI (XML Schema Instance) sul root element: <?xml version="1.0"?> <testo xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="schema.xsd"> Un testo qualunque </testo> Il root element è <testo> dello schema visto in precedenza. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema TIPI DI DATI IN XML Schema ● ● Semplici elementi che NON possono contenerne altri elementi che NON prevedono attributi Complessi elementi che possono contenerne altri elementi che possono avere attributi Si possono usare tipi di dato semplici predefiniti oppure è possibile personalizzarli. Sono previsti numerosi tipi di dato predefiniti Un tipo complesso viene definito con il tag complexType Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema TIPI DI DATI BASE Tipo di dato xs:string xs:integer xs:decimal xs:boolean xs:date xs:time xs:uriReference Descrizione Stringa di caratteri Numero intero Numero decimale Valore booleano Data Ora URI Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Elementi semplici (Simple Elements) <nome>Pippo</nome> <eta>20</eta> <datanascita>1987-05-15</datanascita> <xs:element name="nome" type="xs:string"/> <xs:element name="eta" type="xs:integer"/> <xs:element name="datanascita" type="xs:date"/> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Elementi semplici (Simple Elements) Gli elementi semplici possono avere dei valori di default o prefissati: Un valore di default viene automaticamente assegnato all'elemento quando non viene specificato alcun valore per l'elemento nel documento. Un valore prefissato (fixed) viene automaticamente assegnato all'elemento e non può essere specificato un valore diverso. <xs:element name="colore" type="xs:string" default="rosso"/> <xs:element name="colore" type="xs:string" fixed="rosso"/> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema <xs:element name="quantita" type="xs:integer" /> <quantita>123</quantita> <quantita>centoventitre</quantita> XML Schema prevede anche la possibilità di definire tipi di dato semplici personalizzati come derivazione di quelli predefiniti e permette di definire alcune restrizioni sui valori ammissibili: ● ● ● ● ● RESTRIZIONI RESTRIZIONI RESTRIZIONI RESTRIZIONI RESTRIZIONI SUI VALORI SU UN INSIEME DI VALORI SU UNA SERIE DI VALORI SUI WHITESPACES SULLA LUNGHEZZA Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema XML Schema prevede il tag <xs:attribute> per la definizione degli attributi <xs:attribute name="titolo" type="xs:string" use="required" /> L'attributo use consente di specificare alcune caratteristiche come la presenza obbligatoria (required) oppure un valore predefinito (default) in combinazione con l'attributo value. Ad esempio, la seguente definizione indica un attributo il cui valore predefinito è "test": <xs:attribute name="titolo" type="xs:string" use="default" value="test" /> Se non si specifica esplicitamente l'obbligatorietà dell'attributo, esso è considerato opzionale. Anche gli attributi in XML Schema sono fortemente tipati. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SUI VALORI <xs:element name="quantita" > <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="1" /> <xs:maxInclusive value="100" /> </xs:restriction> </xs:simpleType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UN INSIEME DI VALORI - ENUMERAZIONE <xs:element name="auto"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="FIAT"/> <xs:enumeration value="BMW"/> <xs:enumeration value="AUDI"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="auto" type="TipoAuto"/> <xs:simpleType name="TipoAuto"> <xs:restriction base="xs:string"> <xs:enumeration value="FIAT"/> <xs:enumeration value="BMW"/> <xs:enumeration value="AUDI"/> </xs:restriction> </xs:simpleType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 1 <xs:element name="letteraminuscola"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è UNA SOLA lettera MINUSCOLA dalla “a” alla “z”. Per definire numeri si utilizza la sintassi [0-9] Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 2 <xs:element name="scelta"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[abc]"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è UNA SOLA lettera “a”, “b” oppure “c”. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 3 <xs:element name="parola5"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[A-Z][a-z][a-z][a-z][A-Za-z]"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è una parola di 5 caratteri che comincia per lettera maiuscola, seguita da tre lettere minuscole e terminata da una lettera che può essere maiuscola o minuscola. ES: Ancora, AncorA Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 4 <xs:element name="parola"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è una parola composta da 0 o più occorrenze di lettere minuscole Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 5 <xs:element name="coppiedilettere"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z][A-Z])+"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è una parola composta da una o più coppie di lettere di cui la prima minuscola e la seconda maiuscola. ES: cAsA, cImA, sI, nO, gIaRdInO Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 6 <xs:element name="genere"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="maschio|femmina"/> </xs:restriction> </xs:simpleType> </xs:element> I soli valori ammissibili sono “maschio” o “femmina” Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SU UNA SERIE DI VALORI - 7 <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9]{8}"/> </xs:restriction> </xs:simpleType> </xs:element> Il solo valore ammissibile è una parola composta da esattamente 8 caratteri tra cui lettere maiuscole e minuscole dalla “a” alla “z” e numeri da “0” a “9” Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SUI WHITESPACES (SPAZI) - 1 <xs:element name="elemento"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> </xs:restriction> </xs:simpleType> </xs:element> Tutti i whitespace (Horizontal Tab (HT), Line-feed (LF), Carriage-return (CR), spazio) vengono preservati. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SUI WHITESPACES (SPAZI) - 2 <xs:element name="elemento"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> </xs:restriction> </xs:simpleType> </xs:element> Tutti i whitespace vengono rimpiazzati da spazi. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SUI WHITESPACES (SPAZI) - 3 <xs:element name="elemento"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="collapse"/> </xs:restriction> </xs:simpleType> </xs:element> Tutti i whitespace vengono rimpiazzati da spazi, inoltre vengono eliminati gli spazi a destra e a sinistra (leading e trailing) e gli spazi multipli vengono ridotti ad un unico spazio. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SULLA LUNGHEZZA - 1 <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType> </xs:element> Lunghezza di esattamente 8 caratteri. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema - Restrizioni RESTRIZIONI SULLA LUNGHEZZA - 2 <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="8"/> <xs:maxLength value="12"/> </xs:restriction> </xs:simpleType> </xs:element> Lunghezza compresa tra 8 e 12 caratteri. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ELEMENTI COMPLESSI Un elemento complesso è un elemento che contiene altri elementi e/o attributi Esistono quattro tipi di elementi complessi, ognuno dei quali può contenere attributi ● ● ● ● elementi che contengono solo altri elementi elementi vuoti elementi che contengono solo testo elementi che contengono altri elementi e testo Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Definire un elemento di tipo complesso corrisponde a definirne la relativa struttura. <xs:element name="NOME_ELEMENTO"> <xs:complexType> ... Definizione del tipo complesso ... ... Definizione degli attributi ... </xs:complexType> </xs:element> Se l'elemento può contenere altri elementi possiamo definire la sequenza di elementi che possono stare al suo interno utilizzando uno dei costruttori di tipi complessi previsti... Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ● ● ● ● ● ● <xs:sequence> Consente di definire una sequenza ordinata di sottoelementi <xs:choice> Consente di definire un elenco di sottoelementi alternativi <xs:all> Consente di definire una sequenza non ordinata di sottoelementi, un insieme. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema <persona> <nome>Alessandro</nome> <cognome>Sorato</cognome> </persona> <xs:element name="persona"> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Un elemento incluso in un tipo complesso può essere a sua volta associato ad un altro tipo complesso. In questo modo i tipi possono essere composti, modulari, e la definizione di un tipo può essere condivisa da più elementi. Ciò si può ottenere anche con i DTD mediante l'impiego delle entità parametriche, ma risulta difficilmente applicabile e molto meno comprensibile rispetto all'utilizzo di XML Schema. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema <xs:element name="persona" type="infopersona"/> <xs:complexType name="infopersona"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="docente" type="infopersona"/> <xs:element name="studente" type="infopersona"/> <xs:element name="personale" type="infopersona"/> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema <xs:element name="personale" type="infopersonaext"/> <xs:complexType name="infopersonaext"> <xs:complexContent> <xs:extension base="infopersona"> <xs:sequence> <xs:element name="indirizzo" type="xs:string"/> <xs:element name="CAP" type="xs:integer"/> <xs:element name="citta" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ELEMENTI COMPLESSI – EMPTY (Vuoti) <prodotto prodid="123456" /> <xs:element name="prodotto"> <xs:complexType> <xs:complexContent> <xs:restriction base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element> Esiste anche una forma compatta in cui i tag in corsivo possono essere omessi. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ELEMENTI COMPLESSI – TEXT ONLY (Solo Testo e attributi) <xs:element name="nomelemento"> <xs:complexType> <xs:simpleContent> <xs:extension base="tipobase"> <xs:element name="nomelemento"> <xs:complexType> <xs:simpleContent> <xs:restriction base="tipobase"> .... .... .... .... </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:restriction> </xs:simpleContent> </xs:complexType> </xs:element> Si usano i costrutti extension/restriction per espandere o limitare il tipo base per l'elemento. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ELEMENTI COMPLESSI - TEXT ONLY (Solo Testo ed attributi) <taglia country="IT">48</taglia> <taglia country="US">34</taglia> <xs:element name="taglia" type="TipoTaglia"/> <xs:complexType name="TipoTaglia"> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema ELEMENTI COMPLESSI – MIXED CONTENT <comunicazione> Gentile cliente,<nome>Alessandro Sorato</nome>. Il suo ordine n. <orderid>123456</orderid> sarà evaso il <dataspedizione>2007-05-15</dataspedizione>. </comunicazione> <xs:element name="comunicazione"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="dataspedizione" type="xs:date"/> </xs:sequence> </xs:complexType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema L'impiego dell'indicatore choice permette di specificare una scelta possibile tra vari elementi (oppure) <xs:element name="persona"> <xs:complexType> <xs:choice> <xs:element name="docente" type="infopersona"/> <xs:element name="studente" type="infopersona"/> </xs:choice> </xs:complexType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema L'impiego dell'indicatore all permette di specificare la presenza di un insieme di elementi indipendentemente dall'ordine. Le cardinalità previste sono solo 0,1 per il minimo e 1 per il massimo. <xs:complexType name="infopersona"> <xs:all> <xs:element name="nome" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="cognome" type="xs:string" minOccurs="1" maxOccurs="1"/> </xs:all> </xs:complexType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Sequenze ed alternative possono essere combinate tra loro, come avviene nei DTD, e possono essere indicate le occorenze/ripetizioni. <xs:complexType name="TipoImpegno"> <xs:sequence> <xs:element name="durata" type="xs:string"/> <xs:choice minOccurs="1" maxOccurs="unbounded"> <xs:element name="appuntamento" type="TipoAppuntamento"/> <xs:element name="riunione" type="TipoRiunione"/> <xs:element name="videoconferenza" type="TipoVidConf"/> </xs:choice> </xs:sequence> </xs:complexType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Si possono definire il numero di occorrenze previste utilizzando gli attributi minOccurs e maxOccurs il cui valore di default è 1. <xs:element name="paragrafo"> <xs:complexType> <xs:element name="testo" maxOccurs="unbounded"/> </xs:complexType> </xs:element> Il valore unbounded indica che non è stabilito un massimo numero di elementi testo che possono stare all'interno di un paragrafo. La definizione della struttura di un elemento contiene la definizione di ciascun elemento che può stare all'interno della struttura stessa. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Esistono anche i tipi anonimi, ovvero quando il tipo di un elemento viene dichiarato insieme all'elemento stesso (anonymous type). <xs:complexType name="infopersona"> <xs:sequence> <xs:element name="persona"> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="recapito" type="xs:string"/> </xs:sequence> </xs:complexType> Questo costrutto non prevede (ovviamente) la condivisione del tipo come abbiamo detto precedentemente. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Ci sono poi degli indicatori di gruppo utilizzati per definire insiemi di elementi che possono essere correlati. All'interno della dichiarazione di un gruppo di elementi si devono usare gli indicatori all, choice, o sequence <xs:group name="gruppoinfopersona"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> <xs:element name="compleanno" type="xs:date"/> </xs:sequence> </xs:group> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Una volta che il gruppo è stato definito, esso può essere riutilizzato all'interno di un'altra definizione. <xs:element name="persona" type="infopersona"/> <xs:complexType name="infopersona"> <xs:sequence> <xs:group ref="gruppoinfopersona"/> <xs:element name="nazione" type="xs:string"/> </xs:sequence> </xs:complexType> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Allo stesso modo si possono definire gruppi di attributi con la seguente definizione ed il suo successivo utilizzo. <xs:attributeGroup name="nomegruppoattributi"> ... </xs:attributeGroup> <xs:element name="nomeelemento"> <xs:complexType> <xs:attributeGroup ref="nomegruppoattributi"/> </xs:complexType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Gli elementi <any> e <anyAttribute> permettono di estendere un documento XML con elementi non specificati nello schema senza comprometterne la validazione. <xs:element name="persona"> <xs:element name="persona"> <xs:complexType> <xs:complexType> <xs:sequence> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:anyAttribute/> </xs:complexType> </xs:element> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Le definizioni appena create possono essere utilizzate nei seguenti modi: <persone> <persona> <persone> <persona genere="maschio"> <nome>Mario</nome> <nome>Mario</nome> <cognome>Rossi</cognome> <cognome>Rossi</cognome> <lavori> <lavoro>docente</lavoro> </lavori> </persona> <persona> <nome>Andrea</nome> </persona> <persona genere="femmina"> <nome>Laura</nome> <cognome>Bianchi</cognome> </persona> </persone> <cognome>Bianchi</cognome> </persona> </persone> Supponendo che ci siano altri schemi che definiscano “lavori” e “genere”, i documenti utilizzano le definizioni da vari schemi. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: STRING In ogni caso viene validato correttamente. <xs:element name="persona" type="xs:string"/> <xs:element name="persona" type="xs:normalizedString"/> <xs:element name="persona" type="xs:token"/> <persona>Alessandro Sorato</persona> <persona> Alessandro Sorato Nel primo caso il parser XML mantiene inalterati white spaces, nel secondo, i white spaces vengono sostituiti da spazi singoli, nel terzo i white spaces vengono rimossi (rimangono inalterati gli spazi singoli). </persona> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: STRING In ogni caso viene validato correttamente. <xs:element name="persona" type="xs:string"/> <xs:element name="persona" type="xs:normalizedString"/> <xs:element name="persona" type="xs:token"/> <persona>Alessandro Sorato</persona> <persona> Alessandro Sorato Nel primo caso il parser XML mantiene inalterati white spaces, nel secondo, i white spaces vengono sostituiti da spazi singoli, nel terzo i white spaces vengono rimossi (rimangono inalterati gli spazi singoli). </persona> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: STRING e restrizioni applicabili ● enumeration ● length ● maxLength ● minLength ● pattern ● whiteSpace Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: DATE & TIME <xs:element name="dataora" type="xs:dateTime"/> <xs:element name="periodo" type="xs:duration"/> YYYY-MM-DDThh:mm:ss P nY nM nD T nH nM nS <dataora>2005-02-24T10:00:00</dataora> <periodo>P3Y</periodo> <dataora>2005-02-24T10:00:00.5</dataora> <periodo>P3Y1M6D</periodo> <dataora>2005-02-24T10:00:00Z</dataora> <periodo>P3Y1M6DT4H</periodo> <dataora>2005-02-24T10:00:00-03:00</dataora > <periodo>-P3M</periodo> <dataora>2005-02-24T10:00:00+03:00</dataora > Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: DATE & TIME ● date Defines a date value ● dateTime Defines a date and time value ● duration Defines a time interval ● gDay Defines a part of a date - the day (DD) ● gMonth Defines a part of a date - the month (MM) ● gMonthDay Defines a part of a date - the month and day (MM-DD) ● gYear Defines a part of a date - the year (YYYY) ● gYearMonth Defines a part of a date - the year and month (YYYY-MM) ● time Defines a time value Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: Date & TIME e restrizioni ● Enumeration ● MaxExclusive ● MaxInclusive ● MinExclusive ● MinInclusive ● Pattern ● whiteSpace Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: NUMERICI <xs:element name="numero" type="xs:decimal"/> <xs:element name="numero" type="xs:integer"/> <numero>347.5</numero> <numero>347</numero> <numero>275.45687</numero> <numero>+275</numero> <numero>0</numero> <numero>-6</numero> <numero>0</numero> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: NUMERICI ● byte A signed 8-bit integer ● decimal A decimal value ● int A signed 32-bit integer ● integer An integer value ● long A signed 64-bit integer ● negativeInteger An integer containing only negative values ( .., -2, -1.) ● nonNegativeInteger An integer containing only non-negative values (0, 1, 2, ..) ● nonPositiveInteger An integer containing only non-positive values (.., -2, -1, 0) ● positiveInteger An integer containing only positive values (1, 2, ..) ● short A signed 16-bit integer ● unsignedLong An unsigned 64-bit integer ● unsignedInt An unsigned 32-bit integer ● unsignedShort An unsigned 16-bit integer ● unsignedByte An unsigned 8-bit integer Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: NUMERICI e restrizioni ● enumeration ● fractionDigits ● maxExclusive ● maxInclusive ● minExclusive ● minInclusive ● pattern ● totalDigits ● whiteSpace Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Tipi di dati: ALTRO <xs:attribute name="abilitato" type="xs:boolean"/> <utente abilitato="true">Alessandro</utente> <xs:attribute name="src" type="xs:anyURI"/> <img src="http://www.dsi.unive.it/image.gif" /> <xs:element name="blob" type="xs:hexBinary"/> <xs:element name="blob" type="xs:base64Binary"/> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XML Schema Esempio di schema articolo1.xsd La possibilità di dichiarare elementi e tipi di dato implica l'esistenza di un ambito di visibilità o contesto dei componenti dichiarati. I componenti di uno schema dichiarati al livello massimo, cioè come sottoelementi diretti dell'elemento root, sono considerati dichiarati a livello globale e possono essere utilizzati nel resto dello schema. Nella dichiarazione di un tipo complesso è possibile fare riferimento ad elementi già esistenti dichiarati a livello globale oppure si possono definire nuovi elementi. La definizione di nuovi elementi all'interno di una definizione di tipo o di elemento costituisce una dichiarazione a livello locale. Ciò vuol dire che l'utilizzo di questi elementi è limitato alla definizione del tipo complesso in cui sono dichiarati e non possono essere utilizzati in altri punti dello schema. I nomi degli elementi devono essere univoci nel contesto in cui compaiono. Questo significa, però, che in contesti diversi possiamo avere elementi con lo stesso nome ma con struttura diversa senza rischio di conflitti. Per fare un'analogia con i classici linguaggi di programmazione, le dichiarazioni globali e locali di componenti di uno schema corrispondono alle dichiarazioni di variabili globali e locali in un programma. Esempio di schema articolo2.xsd Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace E' auspicabile integrare elementi derivanti da grammatiche diverse. Ciò ci consentirebbe di riutilizzare parti di grammatiche già definite evitando di dover rifare parte di lavoro già fatto in altri ambiti (o da altri). PROBLEMA ● ● un documento che utilizza due grammatiche presenta il problema della validazione: a quale schema si deve fare riferimento per validare un documento XML "ibrido"? due linguaggi potrebbero avere tag ed attributi con lo stesso nome, anche se utilizzabili in contesti diversi: come fare a risolvere questo tipo di ambiguità? Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace Un namespace è un insieme di nomi di elementi e nomi di attributi identificati univocamente da un identificatore, un prefisso. L'identificatore univoco individua l'insieme dei nomi distinguendoli da eventuali omonimie in altri namespace Il concetto non è affatto nuovo in informatica: ● DATABASE: campi di una tabella ● JAVA: variabili nei packages Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace In XML, un XML Schema definisce implicitamente un namespace degli elementi e degli attributi che possono essere usati in un documento XML. In un documento XML si fa riferimento ad un namespace utilizzando un attributo speciale (xmlns) associato al root element, come nel seguente esempio: <articolo xmlns="http://www.e-terna.net/xmlschema/articolo"> L'identificatore di un namespace è un URI (Uniform Resource Identifier) Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace Per mettere in relazione un namespace con il relativo XML Schema occorre dichiararlo nell'elemento radice <articolo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.e-terna.net/xmlschema/articolo" xmlns="http://www.e-terna.net/xmlschema/bibliografia" xsi:schemaLocation="http://www.eterna.net/xmlschema/articolo articolo.xsd" xsi:schemaLocation="http://www.eterna.net/xmlschema/bibliografia bibliografia.xsd" > L'attributo xmlns:xsi specifica la modalità con cui viene indicato il riferimento allo schema, mentre l'attributo xsi:schemaLocation indica il namespace ed il file in cui è definito il relativo XML Schema separati da uno spazio. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace Riportare il riferimento ad un namespace per ogni elemento è di solito scomodo e rende di difficile lettura il documento XML. Si creano quindi delle abbreviazioni per fare riferimento ai namespace. Le abbreviazioni sono costituite da caratteri alfanumerici seguiti da due punti (:) dichiarati nel root element ed utilizzati come prefissi dei nomi degli elementi. Ecco perché i “:” nei nomi XML sono sconsigliati!!! Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Namespace Le dichiarazioni xmlns:art e xmlns:bibl assegnano i prefissi art: e bibl: ai relativi namespace e questi prefissi vengono utilizzati per ciascun elemento del documento XML. Esempi: CorsodiXML1.xml e CorsodiXML2.xml Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Vincoli di Integrità I DTD hanno la forte limitazione di non gestire dei vincoli di unicità e di integrità referenziale. E' presente il meccanismo basato sull'uso di attributi di tipo ID ed IDREF ma esso è estremamente limitato, in quanto l'unicità degli elementi non dipende dai valori degli elementi stessi, ma da un identificatore esterno. Nell'esempio dell'anagrafica, con i DTD non è possibile stabile che una persona sia identificata univocamente dal proprio nome e cognome. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: Vincoli di Integrità XML Schema introduce dei costrutti analoghi a quelli usati nelle basi di dati per la definizione dei vincoli. ● vincoli di unicità (elemento unique) ● vincoli di chiave primaria (elemento key) ● vincoli di chiave esterna (elemento keyRef) I vincoli di integrità in XML Schema si basano sull'utilizzo di espressioni XPath. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari