XML (extensible Markup Language) Seconda parte
XML Schema: motivazione XML è lo strumento ideale per esprimere documenti di testo, ma è anche molto di più è uno strumento per trasferire DATI STRUTTURATI
XML Schema: motivazione un meccanismo per convertire i dati dal formato interno di un applicazione ad un formato di trasporto, che a sua volta può essere facilmente riconvertito nel formato interno di altre applicazioni
XML Schema: motivazione "Many data-oriented applications are being defined which build their own data structures on top of an XML document layer, effectively using XML documents as a transfer mechanism for structured data. (http://www.w3.org/tr/schema-arch)
XML Schema: motivazione Per esprimere documenti di testo i DTD possono essere sufficienti. Tuttavia, la gestione e il trasferimento di blocchi di dati strutturati (es. i record di un database) richiedono, in generale, un meccanismo di verifica più raffinato.
XML Schema: motivazione XML Schema è stato pensato per fornire quel supporto di validazione che i DTD permettono solo parzialmente (in particolare sul contenuto degli elementi e sui valori degli attributi dei documenti XML).
XML Schema: motivazione Tramite XML Schema, si può realizzare una interfaccia tra applicazione ed applicazione, esprimendo un contratto dettagliato sul formato e l organizzazione dei dati. Il rispetto di questo contratto permette l interoperabilità tra applicazioni differenti.
XML Schema: motivazione XML Schema applicazione 1 applicazione 2 XML formato interno 1 formato interno 2
XML Schema Documentazione ufficiale su XML Schema: http://www.w3.org/xml/schema http://www.w3.org/tr/xmlschema-0/ http://www.w3.org/tr/xmlschema-1/ http://www.w3.org/tr/xmlschema-2/ Non entriamo nei dettagli. Ci limitiamo ad alcune osservazioni di carattere generale.
XML Schema XML Schema usa XML come sintassi, mentre i DTD usano una sintassi propria e particolare, che richiede parser e strumenti di verifica appositi. Per contro, XML Schema è estremamente più verboso, tre o quattro volte più lungo del corrispondente DTD.
XML Schema : <xsd:simpletype> XML Schema prevede più di quaranta tipi semplici predefiniti: - string - float - double un tipo semplice - decimal non può contenere - boolean markup o attributi - date - ecc
XML Schema Ogni tipo semplice è caratterizzato da alcune proprietà, dette facets, che ne descrivono vincoli e formati (es: minlength, maxlength). È possibile derivare nuovi tipi, sia semplici che complessi (strutturati).
Formato di un XML Schema Un documento di XML Schema è racchiuso in un elemento <schema>, e può contenere, in varia forma ed ordine, i seguenti elementi: <import> ed <include> per inserire altri frammenti di schema da altri documenti.
Esempio schema <?xml version = 1.0?> <xsd:schema xmlns:xsd=http://www.w3.org./2001/xmlschema> <xs: element name= proprietario > type= xs:string /> <xs: element name= etichette > type= xs:string /> minoccurs = 1 maxoccurs= 4 /> <xs: element name= editore > type= xs:string /> use=< required /> <xs: element name= pubblicazione type= xs:date /> <xs: element name= inventario type= xs:integer /> use=< required /> Continua
Esempio schema segue 1 <xs: complextype> <xs: sequence> <xs: element name= titolo > type= xs:string /> <xs: element name= autore > type= xs:string /> minoccurs = 1 maxoccurs= unbunded /> <xs: element name= editore > type= xs:string /> use=< required /> </xs:sequence> </xs: complextype>
Esempio schema segue 2 tipi enumerati <xs: simpletype> <xs: restriction base= xs:string /> <xs: enumeration value= rivista /> <xs: enumeration value= rilegato /> </xs:restriction> </xs: simpletype> <xs: element name= formato default rilegato /> </xs: schema>
Formato di un XML Schema <xsd :simpletype> e <xsd: complextype> per la definizione di tipi denominati usabili in seguito. <xsd:element> ed <xsd: attribute> per la definizione di elementi ed attributi globali del documento. <xsd :attributegroup> e <xsd: group> per definire gruppi di attributi e gruppi di elementi.
Il gruppo come contenitore di elementi <xsd : group name = STAFFTYPE > complextype <xsd : sequence> <xsd : element name = Matricola type STMATTIPO /> <xsd : element name = Posizione type STPOSTIPO /> <xsd : element name = DataN type xsd:date /> <xsd : element name = Stipendio type STSTIPTIPO /> </xsd : sequence> </xsd : group>
Il gruppo richiamato x una lista <xsd : element name = Lista STAFF > <xsd : complextype > <xsd : sequence> <xsd : group ref = STAFFTYPE minoccours = 0 maxoccurs= unbounded /> </xsd : sequence> </xsd : complextype> </xsd : element>
Impongo per il contatto - Un solo telefono - Un solo indirizzo e-mail Unicità dei valori <?xml version="1.0" encoding="iso-8859-1"?> <rubrica> <contatto> <nome> Mario </nome> <cognome> Rossi </cognome> <telefono> 011-555-5678 </telefono> <email> mario.rossi@libero.it </email> </contatto> </rubrica>
unicità dei valori Imponendo vincoli di : -Unicità -Valore NON NULLO Specifica di chiave <xsd: unique name= soloquesti > <xsd:selector xpath : = contatto /> <xsd: field xpath := telefono /> <xsd: field xpath := email /> </xsd: unique> <?xml version="1.0" encoding="iso-8859-1"?> <rubrica> <contatto> <nome> Mario </nome> <cognome> Rossi </cognome> <telefono> 011-555-5678 </telefono> <email> mario.rossi@libero.it </email> </contatto> </rubrica>
Formato di un XML Schema <xsd: notation> per definire notazioni non XML all interno di un documento XML. <xsd :annotation> per esprimere commenti per esseri umani o per applicazioni diverse dal parser di XML Schema.
Vocabolario Insieme di comandi o nomi che possono essere utilizzati nello schema (es. element, sequence, group, etc ).
L identificazione dei vocabolari Il proliferare di specifiche basate su XML rende opportuno poter sfruttare vocabolari definiti altrove, purché ciò avvenga senza determinare conflitti e ambiguità all interno dei documenti. Uno stesso documento XML potrebbe contenere alcuni elementi definiti in un vocabolario ed altri in un altro.
L identificazione dei vocabolari Il problema è identificare esattamente l'ambito di ciascun elemento, conciliando la presenza di più vocabolari, e soprattutto conciliando la presenza di elementi aventi lo stesso nome ma differente significato. I namespace sono stati introdotti per rispondere a questa esigenza.
Vocabolario Insieme di comandi o nomi che possono essere utilizzati nello schema (es. element, sequence, group, etc ). I namespace permettono di identificare nomi di elementi e relazioni in documenti XML in modo da evitare conflitti nella definizione di elementi che: - hanno lo stesso nome - Sono definiti da piu di un vocabolario
Esempio posso creare due namespace: uno per le persone e uno per i siti <riferimento> <nome> Mario Rossi </nome> <indirizzo> Via Roma, 73 </indirizzo> </riferimento> <riferimento> <nome> XML Italia </nome> <indirizzo> http://www.xml.it </indirizzo> </riferimento>
Namespace in XML NAMESPACE: COLLEZIONE DI NOMI, associati a elementi e attributi di documenti XML, IDENTIFICATA DA UN URI (Uniform Resource Identifier) Visibilità al di fuori del singolo documento
Namespace <xsl:stylesheet xmlns: xsl =http://www.w3.org/tr/wd-xsl> Utilizzo di namespace per la definizione del foglio di stile
Esempio <riferimento xmlns:a= http://www.unica.it/prova/a/ xmlns:b= http://www.unica.it/prova/b> <a:nome> Mario Rossi </a:nome> <b:indirizzo> http://www.xml.it </b:indirizzo> </riferimento>
Namespace in XML N.B. I namespace servono a togliere l ambiguità sui nomi, non a definire i nomi. L URI che identifica il namespace non punta necessariamente a un DTD o a uno schema o a qualunque definizione.
Namespace e DTD È difficile far coesistere i DTD e i namespace (i primi sono nati con XML, i secondi sono stati introdotti successivamente) Per validare documenti XML contenenti namespace, occorre creare dei DTD che contengano la dichiarazione completa dei nomi con i prefissi
Namespace e XML Schema XML Schema offre invece un supporto estensivo per la qualificazione di elementi e attributi tramite namespace. Un documento può essere validato in relazione ad uno o più schemi: alle componenti di ciascuno schema è associato uno specifico namespace, detto targetnamespace
Namespace e XML Schema È possibile specificare regole di validazione solo su alcuni e non tutti i namespace che compaiono in un documento. È possibile dare indicazioni al parser per controllare la coesistenza con elementi di altri namespace.
Presentazione dei dati Oltre a definire il tipo di documento (conformità) e le regole di validità, occorre specificare le modalità secondo cui le applicazioni dovranno rappresentare i dati. CONTENUTO documento XML PRESENTAZIONE foglio di stile
Presentazione dei dati Il foglio di stile (stylesheet) specifica come devono essere rappresentati i singoli elementi del documento XML. I fogli di stile più semplici sono quelli a cascata (CSS), che offrono tuttavia funzionalità limitate (a ciascun elemento è assegnata una caratterizzazione puramente tipografica ).
Indicazione dello stile <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE rubrica SYSTEM "rubrica.dtd"> <?xml-stylesheet type="text/css" href="stile.css"?> <rubrica> <contatto> foglio di stile <nome> Mario </nome> <cognome> Rossi </cognome> <telefono> 011-555-5678 </telefono> <email> mario.rossi@libero.it </email> </contatto> </rubrica>
XSL (Extensible Stylesheet Language) Funzionalità più avanzate per la presentazione dei documenti XML sono offerte dal linguaggio XSL (Extensible Stylesheet Language). L XSL è definito tramite lo stesso XML ed è suddiviso in due parti: un linguaggio di trasformazione (XSLT) un linguaggio di formattazione (XSL:FO)
XSLT XSLT (XSL Transform): insieme di regole per selezionare ed elaborare il contenuto dei documenti Grazie all XSLT è possibile interpretare un file XML e trasformarlo in qualcos altro, ad esempio in HTML.
LE QUERY
XML Query Working Group Formato dal W3 nel 1999 per definire : - Un modello dei dati per documenti XML - Un insieme di OPERATORI per query su questo modello - Un LINGUAGGIO di Query su questi operatori
XQuery :cos e? - Linguaggio di Query di tipo dichiarativo - Fornisce una semplice sintassi per interrogare porzioni di documenti XML - Ricerca collezioni di documenti specificando un path simile ad una directory -Permette condizioni di qualifica sul path per semplificare la ricerca
XQuery : cos e? - XQuery è per XML l equivalente di SQL per i database - XQuery è basato su espressioni XPath - XQuery è supportato da tutti i piu popolari DBMS (Oracle,IBM,Microsoft etc ) -XQuery usa funzioni per estrarre i dati dai documenti XML: doc( nomefile ) apre il documento XML data(nome_elem) estrae i dati dall elemento
XPATH : a cosa serve XQuery usa espressioni XPath per navigare in XML. Ogni documento è visto come un albero La ricerca parte da un context node prosegue secondo una espressione XPath che specifica come navigare nel documento
Espressione XPATH E composta da una serie di step Separati da / come nelle usuali directory Ogni step consente, rispetto allo step precedente, uno spostamento in profondità nell albero che descrive il documento
Espressione XPATH Operatori nodo seleziona tutti i figli di un nodo / seleziona nodo radice // tutti i sottonodi del nodo corrente. nodo corrente.. tutti i genitori del nodo corrente @ seleziona gli attributi * ogni elemento del nodo @* ogni attributo del nodo
Predicati XPATH XQuery usa i predicati Xpath per limitare la selezione dei dati [i] i-esimo elemento della xpath expression [last()] ultimo elemento della xpath expression [last()-i] variazione del precedente [position()<i] elementi da i a i-1 della xpath expression. [@attname] nodi con attributo attname [@attname= val ] nodi con attributo attname=val [@attname> val ] nodi ii cui elementi soddifano espressione data
Location Path E composto da una sequenza di espressioni (location steps) separate dal carattere /
Location Path... / // /child::staff (/STAFF) child::staff (STAFF) attribute::nome (@nome) attribute::* (@*) child::staff[3] Significato Nodo contesto Genitore del nodo contesto Nodo radice Discendente nodo corrente Elementi STAFF figli della radice Elemento STAFF figlio delcontesto Attributo nome del nodo contesto Tutti gli attributi del contesto Terzo el. STAFF figlio context
Location path /child::staff[@nome=rossi] /child::staff[@nome=rossi] [position()=1] Significato Tutti gli elementi di staff il cui nome è instanziato con il valore Rossi Il primo elemento di staff il cui nome è instanziato con il valore Rossi
Esempi Di utilizzo di Xpath in una XQuery
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <STAFF bn= B3 > <STAFFN> SL22</STAFFN> <NOME> <BNOME> Anna </BNOME> <COGNOME>Rossi </COGNOME></NOME> <POSIZIONE> Assistente </POSIZIONE> <DATA> 21-1-76 </DATA> <STIPENDIO> 1200 </STIPENDIO> </STAFF> <STAFFLIST>
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> Numero di staff (STAFFN)del primo componente dello staff doc( s-list.xml ) /STAFFLIST /STAFF[1] //STAFFN Apre file elemento nodostaff il suo codice doc( s-list.xml )/STAFFLIST/STAFF[1]//STAFFN oppure doc( s-list.xml )//STAFF[1]//STAFFN
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> Numero di staff dei primi DUE componenti dello staff doc( s-list.xml ) /STAFFLIST /STAFF[1 TO 2] //STAFFN Apre file elemento i primi 2 I loro codici doc( s-list.xml )/STAFFLIST/STAFF[1 TO 2]//STAFFN
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> COGNOMI componenti staff B5 doc( s-list.xml ) /STAFFLIST /STAFF[@BN= B5 ] //COGNOME doc( s-list.xml )/STAFFLIST/ STAFF [@BN= B5 ] //COGNOME Predicato che delimita la query
Altro esempio: specifiche DTD <!ELEMENT rubrica (contatto+) > <!ELEMENT contatto (nome, cognome, telefono, email*,eta?,sesso) > <!ELEMENT nome (#PCDATA) > <!ELEMENT cognome (#PCDATA) > <!ELEMENT telefono (#PCDATA) > <!ELEMENT email (#PCDATA) <!ELEMENT eta (#PCDATA)..segue
Altro Esempio: specifiche DTD <!ELEMENT sesso (maschio femmina) > <!ELEMENT maschio EMPTY> <!ELEMENT femmina EMPTY> <!ATTLIST contatto num ID #REQUIRED> <!ATTLIST contatto gruppo (casa amici lavoro) amici> <!ATTLIST contatto bestfriends IDREF #IMPLIED> <!ATTLIST nome nickname CDATA #IMPLIED>
Altro Esempio: le query doc ( rubrica.xml)/rubrica/contact/nome doc ( rubrica.xml)/rubrica/contact [@*] doc ( rubrica.xml)//contact/sesso/* doc ( rubrica.xml)//contact [@gruppo= amici ] doc ( rubrica.xml)//contact [eta>25]
Per gentile concessione IBM
Le FLWOR expressions (leggi FLOWER) Utilizzate per formulare le XQUERY FOR forvar IN espressione LET LetVar:=letEspressione [WHERE espressione filtro] [ORDER BY tipo di ordinamento] RETURN espressione Una FLWOR expression: -comincia con una o piu clausole FOR e/o LET -seguite da WHERE e ORDER opzionali -si conclude con una clausola RETURN
Le FLWOR expressions (leggi FLOWER) Utilizzate per formulare le XQUERY FOR seleziona un insieme di elementi LET assegna un insieme di elementi ad una variabile [WHERE espressione filtro:impone condizioni sui valori] [ORDER BY tipo di ordinamento] RETURN restituisce i risultati della query for $x in doc ( rubrica.xml ) //contact where $x/eta >20 and $x/eta <30 order by $x/nome return $x
Le FLWOR expressions (leggi FLOWER) for $p in doc ( rubrica.xml ) //contact where $p [@group= casa ] return $p/name I nomi degli appartenenti al gruppo casa for $p in doc ( rubrica.xml ) //contact [@group= family ] where $p/eta>20 and $p/eta<30 order by $p/nome return $p I nomi degli appartenenti al gruppo amici Di età compresa tra 20 e 30, in ordine alf.
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <STAFF bn= B3 > <STAFFN> SL22</STAFFN> <NOME> <BNOME> Anna </BNOME> <COGNOME>Rossi </COGNOME></NOME> <POSIZIONE> Assistente </POSIZIONE> <DATA> 21-1-76 </DATA> <STIPENDIO> 1200 </STIPENDIO> </STAFF> <STAFFLIST>
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> documentoxml Cosa rende la query LET $STIP := 3000 RETURN doc( s-list.xml )//STAFF [STIPENDIO=$STIP] Lista lo staff con stipendio=3000 <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF>
FLWOR expressions Le clausole FOR e LET effettuano un binding di valori di una o piu variabili utilizzando path expressions. La clausola LET effettua il binding della variabile $STIP con una lista contenente tutti gli elementi STAFF L operatore = è detto operatore di confronto generale utilizzato per il confronto di 2 valori atomici Altri operatori : eq ne lt le gt ge
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> La clausola FOR è utilizzata iterativamente in tutti gli elementi STAFF del documento: Ad ogni iterazione si effettua il test dell elemento STIPENDIO e dell attributo bn <STAFFN> SL21</STAFFN> Cosa rende la query FOR $S IN doc( s-list.xml )//STAFF WHERE $S/STIPENDIO >1500 AND $S/@bn = B5 RETURN $S/STAFFN Lista i componenti dello STAFF B5 che hanno stipendio >1500
La clausola FOR Utilizzata per esprimere un iterazione Associa (tramite IN) ad una variabile ($S) una espressione che rende una lista di nodi. L esito di una for e una tupla stream che associa al valore assunto dalla variabile uno o piu items che verificano il valore espresso dall espressione WHERE associata.
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <STAFFN> SL21</STAFFN> <STAFFN> SL22</STAFFN> Cosa rende la query FOR $S IN doc( s-list.xml )//STAFF ORDER BY $S/STAFFN DESCENDING RETURN $S/STAFFN Lista tutti gli STAFF in ordine decrescente di STAFFN
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <FAMLIST> <FAM> <STAFFN> SL21</STAFFN> <NOME> Signora Mariarosa </NOME> </FAM> </FAMLIST> QUERY su piu documenti Lista gli STAFF che hanno familiari FOR $S IN doc( s-list.xml )//STAFF, $FAM IN doc( f-list.xml )//FAM, WHERE $S/STAFFNO = $FAM/STAFFN RETURN <FAMIGLIA> {$S, $FAM/NOME } </FAMIGLIA>
<FAMIGLIA> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <NOME> Signora Mariarosa </NOME> </FAMIGLIA> Esito della Query Gli elementi di staff che non hanno parenti sono esclusi. FOR $S IN doc( s-list.xml )//STAFF, $FAM IN doc( f-list.xml )//FAM, WHERE $S/STAFFNO = $FAM/STAFFN RETURN <FAMIGLIA> {$S, $FAM/NOME } </FAMIGLIA>
<STAFFLIST> <STAFF bn= B5 > <STAFFN> SL21</STAFFN> <NOME> <BNOME> Gianni </BNOME> <COGNOME>Bianchi </COGNOME> </NOME> <POSIZIONE> Manager </POSIZIONE> <DATA> 13-10-48 </DATA> <STIPENDIO> 3000 </STIPENDIO> </STAFF> <FAMLIST> <FAM> <STAFFN> SL21</STAFFN> <NOME> Signora Mariarosa </NOME> </FAM> </FAMLIST> QUERY su piu documenti Lista gli STAFF con i familiari (Outer Join SX) FOR $S IN doc( s-list.xml )//STAFF RETURN <FAMSTAFF> {$S } {FOR $FAM IN doc( f-list.xml )//FAM WHERE $S/STAFFN=$FAM/STAFFN RETURN $FAM/NAME } </FAMSTAFF>