CORSO SUI DATABASE - XML

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "CORSO SUI DATABASE - XML"

Transcript

1 Rel Luigi Ferrari

2 Indice 1. XML Introduzione a XML Obiettivi Riferimenti Sintassi di un file XML Analisi di un file XML Parsing e controllo della correttezza di un file XML Il contenuto in dettaglio: i caratteri di XML Dati di caratteri e testo di markup Caratteri vuoti (normalizzazione) Entita' e riferimenti ad entita' Markup Le sezioni CDATA Namespace Validazione: DTD e XML Esempio di DTD Uso di DTD e XML Regole per verificare se un file XML e' corretto Trasformazione con fogli di stile (XSLT) Trasformazioni XSL (XSLT) XML e java Import ed export tra java e file XML Parser SAX e DOM Confronto tra parser SAX e parser DOM Parser DOM Esempio di import (con parser Sax) Export XML e i DBMS Autovalutazione dell'apprendimento Domande Esercizi di autovalutazione Risposte agli esercizi di autovalutazione Esercizi senza soluzione Trucchi XSLT Ambienti di sviluppo Microsoft e XML Oracle Bibliografia essenziale XSL JAVA e XML XML Bible (?) XSL-Concepts-and-pratical-Use-Slides.htm LGEI N_ 1 Anno IV - Linux, Java e XML.htm... 16

3 msdn.microsoft.com technet.oracle.com XML schema Computer programming DEV

4

5 1. XML 1.1. Introduzione a XML XML e' una tecnologia che serve a creare linguaggi di markup che descrivono i dati, teoricamente di qualsiasi tipo, in un modo strutturato. Diversamente da HTML, che limita l'autore di un documento a un insieme prestabilito di tag, XML consente agli autori di descrivere i dati in modo piu' accurato, creando nuovi tag. XML puo' essere utilizzato per creare linguaggi di markup che descrivono i dati in quasi tutti i campi applicativi Obiettivi Creare un documento XML Spiegare il concetto di parser Utilizzare gli elementi e gli attributi del linguaggio XML Spiegare la differenza fra testo di markup e dati di caratteri Utilizzare i caratteri Unicode in un documento XML Creare una sezione CDATA Spiegare il concetto di documento well formed Spiegare il concetto di namespace Riferimenti Parte di questi appunti sono presi da: Deitel,XML, cap. 5 - FONDAMENTI DI XML (scaricabile dal sito del libro gratuitamente). Transferring Data With XML, Sun Technical Tips (java.sun.com) FORMALIZZAZIONE/tecnologie-xml.html Sintassi di un file XML Il formato XML assomiglia molto al formato HTML: in realta' e' una sua generalizzazione, con sintassi che possiamo definire come desideriamo. Il formato e' molto rigido e richiede che i dati contenuti siano inseriti secondo regole precise. Un file XML puo' essere visualizzato su un browser se si fornisce un file di "interpretazione", detto foglio di stile (stylesheet, con estensione.xsl) che consente al browser di tradurre le informazioni contenute nel file XML in formato HTML. E' possibile, fornendo stylesheets adeguati, tradurre un file XML in qualunque formato: un esempio e' la trasformazione in documenti pdf. Consideriamo un semplice documento XML (intro.xml xml) che contrassegna un messaggio come XML. 1 <?xml version = "1.0"?> 2 3 <!-- Figura 1 : intro.xml --> 4 <!-- Un semplice documento XML--> - 1 -

6 5 6 <mymessage> 7 <message>benvenuti in XML!</message> 8 </mymessage> Notate che i numeri di riga non fanno parte del documento XML, ma servono soltanto per identificare piu' facilmente le istruzioni XML. I documenti XML di solito vengono registrati in file che hanno estensione xml xml, anche se questo non sia obbligatorio. Per creare un documento XML e' possibile utilizzare qualsiasi editor di testi. Molti pacchetti software consentono di salvare i dati come documenti XML Analisi di un file XML Il documento presentato inizia con una dichiarazione nella riga 1. Questa dichiarazione specifica la versione di XML cui e' conforme il documento XML; in questo caso, la versione e' 1.0 (che attualmente e' l'unica versione ufficiale del linguaggio XML). Le righe 3 e 4 contengono dei commenti. XML usa la stessa sintassi dei commenti del linguaggio HTML. NOTA: Sebbene la dichiarazione XML sia facoltativa, dovreste utilizzarla sempre per identificare la versione XML dei vostri documenti. Altrimenti, in futuro, un documento senza tale dichiarazione dovrebbe essere conforme all'ultima versione di XML; questo potrebbe causare errori e altri problemi. Tutti i documenti XML devono contenere un solo elemento radice o root (come mymessage nelle righe 6 e 8). L'elemento radice contiene tutti gli altri elementi del documento XML. Le righe che precedono l'elemento radice sono il prologo del documento XML. L'elemento message (riga 7) si chiama elemento child (figlio) dell'elemento mymessage mymessage, perche' e' annidato all'interno di mymessage mymessage. L'elemento child contiene il testo del messaggio "Benvenuti in XML!". NOTA: E' un errore annidare in modo improprio gli elementi XML. Per esempio, e' sbagliato scrivere <x><y>ciao</x></y> y>, in quanto l'elemento y deve essere chiuso prima dell'elemento x (in altre parole, il tag finale </y> deve precedere </x> x>) Parsing e controllo della correttezza di un file XML Per elaborare un documento XML occorre un apposito programma software chiamato parser o processore XML. Il parser legge il documento XML, controlla la sua sintassi, segnala eventuali errori e consente di elaborare il contenuto del documento. Un documento XML e' considerato well formed se e' sintatticamente corretto. La sintassi del linguaggio XML richiede che ci sia un solo elemento radice, che ogni elemento abbia un tag iniziale e un tag finale, che gli elementi siano appropriatamente annidati e che tutti i valori degli attributi siano racchiusi fra virgolette. Inoltre, XML e' un linguaggio case sensitive; questo significa che i caratteri maiuscoli non sono trattati come quelli minuscoli. Un documento XML che rispetta tutte queste convenzioni sintattiche e' un documento well formed. I parser possono supportare il modello DOM (Document Object Model) e/o il metodo SAX (Simple API for XML) per accedere al contenuto di un documento in modo programmatico, utilizzando linguaggi come Java, Python, C o un altro linguaggio di programmazione. Un parser basato sul DOM crea una struttura ad albero che registra in memoria i dati del documento XML. Un parser basato sul metodo SAX elabora il documento XML e genera degli eventi (o notifiche all'applicazione) quando incontra i tag, i testi, i commenti o altri oggetti all'interno del documento. Questi eventi restituiscono i dati del documento XML. Molti parser XML possono essere scaricati gratuitamente dal Web. Alcune applicazioni, come Microsoft Internet Explorer 5 (IE5), includono i loro parser XML. Fra i parser piu' noti figurano msxml (il parser di IE5 di Microsoft), Xerces di Apache, Java API for XML Parsing (JAXP) di Sun Microsystem e XML for Java (XML4J) dell'ibm Il contenuto in dettaglio: i caratteri di XML Descriveremo ora il set dei caratteri utilizzato nei documenti XML e alcune delle sue proprieta'. Un set di caratteri e' formato dai caratteri che possono essere rappresentati in un - 2 -

7 documento. Per esempio, il set dei caratteri ASCII (American Standard Code for Information Interchange) contiene le lettere dell'alfabeto inglese, le cifre da 0 a 9 e i simboli di punteggiatura, come!, - e?. I documenti XML possono contenere i seguenti caratteri: carriage return (ritorno carrello), line feed (avanzamento riga) e caratteri Unicode. Unicode e' uno standard prodotto da Unicode Consortium. L'obiettivo di questo standard e' consentire ai computer di elaborare i caratteri della maggior parte delle lingue del mondo. Il sito contiene maggiori informazioni sullo standard Unicode Dati di caratteri e testo di markup Dopo che il parser ha verificato che tutti i caratteri di un documento sono ammissibili, passa a distinguere il testo di markup dai dati di caratteri. Il testo di markup e' racchiuso fra parentesi angolari (< e >). I dati di caratteri sono i testi compresi fra un tag iniziale e un tag finale. Gli elementi child sono considerati markup, non dati di caratteri. Le righe 1, 3-4 e 6-8 nell'esempio contengono testi di markup. Nella riga 7, i tag <message> e </message> sono testi di markup, mentre le parole "Benvenuti in XML!" sono dati di caratteri Caratteri vuoti (normalizzazione) Gli spazi, i caratteri di tabulazione, i carriage return e i line feed sono chiamati caratteri vuoti (whitespace characters). Occorre un parser XML per passare tutti i caratteri di un documento, inclusi quelli vuoti, all'applicazione che usa il documento XML. Un'applicazione puo' considerare i caratteri vuoti come significativi (vengono preservati dall'applicazione) o insignificanti (vengono ignorati dall'applicazione). Alcune applicazioni rimuovono completamente i caratteri vuoti insignificanti o li riducono a un solo carattere vuoto. Questo processo si chiama normalizzazione. Per esempio, la seguente riga <markup>questi sono dati di caratteri</markup> contiene quattro caratteri vuoti significativi nei dati di caratteri. Dopo la normalizzazione, i cinque spazi fra "di" e "caratteri" vengono ridotti a un solo spazio significativo Entita' e riferimenti ad entita' In un documento XML e' possibile utilizzare quasi tutti i caratteri. Sono esclusi i caratteri & (e commerciale o ampersand), < (minore), > (maggiore), ' (apostrofo) e " (virgolette doppie), perche' sono riservati al linguaggio XML e non possono essere utilizzati nei dati di caratteri. Per utilizzare questi caratteri nel contenuto o negli attributi degli elementi XML, bisogna utilizzare i riferimenti alle entita', che iniziano con il carattere & e terminano con un punto e virgola (;). I riferimenti alle entita' impediscono al parser XML di interpretare i caratteri riservati come testo di markup. Per esempio, le parentesi angolari < e > servono a delimitare i tag XML. Se queste parentesi vengono inserite nel contenuto di un elemento o in un attributo, il parser tratta questi simboli come markup e il documento XML non viene interpretato correttamente. L'apostrofo e le virgolette doppie sono caratteri riservati che servono a delimitare i valori degli attributi degli elementi XML. Come detto in precedenza, non e' possibile includere all'interno dei dati di caratteri alcuni simboli riservati di XML; per farlo bisogna utilizzare i riferimenti alle entita'. Il linguaggio XML dispone delle seguenti entita': &: per il carattere & (e commerciale o ampersand), <: per il carattere < (minore o less than), >: per il carattere > (maggiore o greater than), &apos;: per il carattere ' (apostrofo) e - 3 -

8 ": per il carattere " (virgolette doppie o quotation mark). Per esempio, per utilizzare i tre caratteri <>& all'interno dell'elemento message dovro' scrivere: <>& Utilizzando le entita' al posto dei caratteri <, > e &, si indica al parser XML di non considerare questi caratteri come testo di markup Markup Questo paragrafo spiega come specificare gli elementi XML e i loro attributi per scrivere correttamente i testi di markup. Come detto in precedenza, un elemento XML e' formato da un tag iniziale, un contenuto e un tag finale. Diversamente dal linguaggio HTML, in XML tutti i tag iniziali devono avere i corrispondenti tag finali. Per esempio, l'istruzione <img src = "immagine.gif"> e' corretta in HTML, ma in XML deve essere scritta in questo modo <img src = "immagine.gif" ></img> Questo tipo di elemento si chiama elemento vuoto, perche' e' privo di contenuto (non ci sono dati di caratteri). In alternativa, un elemento vuoto puo' essere scritto piu' concisamente in questo modo <img src = "immagine.gif" /> dove il simbolo / (slash) svolge la funzione di tag finale. Gli elementi definiscono la struttura di un documento XML. Un elemento puo' avere o no un contenuto (dati di caratteri o elementi child). Gli attributi definiscono gli elementi. Un elemento puo' avere uno o piu' attributi o esserne privo. Gli attributi devono essere posti all'interno del tag iniziale dell'elemento. I valori degli attributi devono essere racchiusi fra virgolette (semplici o doppie). Per esempio, l'elemento macchina <macchina porte = "4"/> contiene l'attributo porte il cui valore e' 4. I nomi degli elementi e degli attributi XML possono avere qualsiasi lunghezza e possono contenere lettere, cifre, caratteri di sottolineatura, trattini e punti, ma devono iniziare con una lettera o un carattere di sottolineatura. NOTA: e' un errore di sintassi specificare il valore di un attributo senza racchiuderlo fra virgolette semplici o doppie Le sezioni CDATA Le sezioni di un documento XML, chiamate sezioni CDATA, possono contenere testi, caratteri riservati (per esempio, i simboli < e >) e caratteri vuoti (whitespace characters). I dati di caratteri in una sezione CDATA non vengono elaborati dal parser XML. Tipicamente, una sezione CDATA viene utilizzata per contenere gli script (come Javascript o VBScript), che spesso includono i caratteri speciali &, <, >, ' e ". Il seguente documento XML confronta il testo di una sezione CDATA con i dati di caratteri. 1 <?xml version = "1.0"?> 2 3 <!-- Figura 5.7 : cdata.xml --> 4 <!-- Una Sezione CDATA che contiene un codice C++ --> 5 6 <book title = "C++ How to Program" edition = "3"> 7 8 <sample> 9 // C++ comment - 4 -

9 10 if ( this->getx() < 5 && value[ 0 ]!= 3 ) 11 cerr << this->displayerror(); 12 </sample> <sample> 15 <![CDATA[ // C++ comment 18 if ( this->getx() < 5 && value[ 0 ]!= 3 ) 19 cerr << this->displayerror(); 20 ]]> 21 </sample> C++ How to Program by Deitel & Deitel 24 </book> Il primo elemento sample (righe 8-12) contiene il codice C++ come dati di caratteri. Ogni carattere <, > e & deve essere sostituito con il riferimento all'entita' corrispondente, per evitare errori sintattici. Le righe utilizzano una sezione CDATA per identificare un blocco di testo che il parser non deve trattare come dati di caratteri o markup. Una sezione CDATA inizia con i caratteri <![CDATA[ e termina con ]]> ]]>. Si noti che i caratteri <, > e & (righe 18 e 19) non devono essere sostituiti da riferimenti a entita'. IE5 preserva anche i caratteri vuoti nella sezione CDATA, sebbene questo non sia richiesto dai processori XML. Poiche' una sezione CDATA non viene elaborata dal parser, puo' contenere qualsiasi testo, inclusi i caratteri riservati di XML, come <, > e &. Tuttavia, una sezione CDATA non puo' contenere il testo ]]> ]]>, perche' questo testo serve a chiudere una sezione CDATA Namespace Dal momento che XML consente agli autori di creare i propri tag, si possono verificare dei conflitti di nomi (cioe' due elementi differenti con lo stesso nome). Per esempio, potremmo utilizzare l'elemento book per definire il markup dei dati per uno dei nostri libri. Un collezionista di francobolli potrebbe creare un elemento book per definire il markup dei dati per un libro di filatelia. Se entrambi gli elementi fossero utilizzati nello stesso documento XML, ci sarebbe un conflitto di nomi che renderebbe difficile stabilire i tipi di dati che sono contenuti in ciascun elemento. I namespace sono strumenti che permettono agli autori di evitare i conflitti dei nomi. Per esempio, le istruzioni e <argomento>matematica</argomento> <argomento>trombosi</argomento> utilizzano lo stesso elemento per identificare due argomenti differenti; il primo e' una materia che si studia a scuola, mentre il secondo e' un fenomeno che riguarda la medicina. Questi due elementi possono essere distinti utilizzando i namespace, come dimostra il seguente esempio e <scuola:argomento>matematica</scuola:argomento> <medicina:argomento>trombosi</medicina:argomento> In questo caso, scuola e medicina sono i prefissi dei namespace. Questi prefissi devono precedere i nomi degli elementi e degli attributi per specificare il namespace in cui e' possibile trovare gli elementi o gli attributi. Ogni prefisso e' collegato a un URI (Uniform Resource Identifier) che identifica in modo univoco il namespace. Gli autori dei documenti possono creare i loro prefissi come nel seguente esempio (righe 6 e 7): 1 <?xml version = "1.0"?> 2 3 <!-- Figura 5.8 : namespace.xml --> 4 <!-- Uso dei namespace --> 5 6 <directory xmlns:text = "urn:deitel:textinfo" 7 xmlns:image = "urn:deitel:imageinfo"> - 5 -

10 8 9 <text:file filename = "book.xml"> 10 <text:description>a book list</text:description> 11 </text:file> <image:file filename = "funny.jpg"> 14 <image:description>a funny picture</image:description> 15 <image:size width = "200" height = "100"/> 16 </image:file> </directory> Teoricamente, e' possibile utilizzare qualsiasi nome per un namespace, tranne il namespace riservato xml. L'esempio mostra come creare i namespace. In questo documento XML, due elementi file vengono differenziati dai namespace. Le righe 6 e 7 utilizzano il namespace xmlns per creare due prefissi di namespace: text e image. I valori assegnati agli attributi xmlns:text e xmlns:image si chiamano URI (Uniform Resource Identifier). Per definizione, un URI e' una serie di caratteri che serve a differenziare i nomi. Per assicurarsi che un namespace sia unico, l'autore di un documento deve fornire un URI unico. Nell'esempio in esame, abbiamo utilizzato urn:deitel:textinfo e urn:deitel:imageinfo come URI. e' prassi comune utilizzare gli URL (Universal Resource Locators) al posto degli URI (ad esempio ad esempio le righe 6 e 7 potrebbero essere inserite come: <directory xmlns:text = " xmlns:image = " Le righe 9-11 utilizzano il prefisso del namespace text per descrivere gli elementi file e description description. Notate che anche i tag finali hanno il prefisso text. Le righe applicano il prefisso image agli elementi file, description e size. Per evitare di scrivere il prefisso in ogni elemento, gli autori possono specificare un namespace di default per un elemento e tutti i suoi elementi child Validazione: DTD e XML Per definire un nuovo linguaggio (cioe' un insieme di regole cui il linguaggio deve sottostare e' possibile utilizzate un DTD (Document Type Definition) Esempio di DTD <!ELEMENT listinoprezzi (caffe)*> <!ELEMENT caffe (nome, prezzo)> <!ELEMENT nome (#PCDATA)> <!ELEMENT prezzo (#PCDATA)> Nella prima riga definisco un tag "listinoprezzi", costituito da un numero arbitrario di tag "caffe". Nella seconda riga definisco un tag "caffe", costituito da un tag "nome" e da un tag "prezzo". Nelle ultime due righe, i tag "nome" e "prezzo" non sono a loro volta costituiti da altri tag, ma contengono solo testo Uso di DTD e XML Per poter controllare la sintassi di un file XML e' meglio assciargli un DTD che ne descriva la struttura. Eccone un esempio: File: coffees.dtd <?xml version='1.0' encoding='utf-8'?> <!ELEMENT listinoprezzi (caffe)*> <!ELEMENT caffe (nome, prezzo)> <!ELEMENT nome (#PCDATA)> - 6 -

11 <!ELEMENT prezzo (#PCDATA)> All'inizio del file della DTD, nella prima riga, definito prologo, si specifica la versione di XML e il set di caratteri usato. File: listino.xml: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE listino SYSTEM "gcoffees.dtd"> <listinoprezzi> <caffe> <nome>mocha Java</nome> <prezzo>11.95</ prezzo> </caffe> <caffe> <nome>sumatra</nome> <prezzo>12.50</ prezzo> </caffe> </listinoprezzi> Nella prima riga all'inizio del documento XML dichiariamo la DTD di riferimento. Una caratteristica fondamentale di XML e' la possibilita' di rappresentare la struttura delle informazioni (mediante i tag); in particolare i tag in un documento XML definiscono una struttura gerarchica. NOTA: E' possibile inserire la DTD direttamente nel file XML Regole per verificare se un file XML e' corretto Un documento XML e' ben formato se rispetta le regole sintattiche dell'xml Intuitivamente, un documento e' ben formato se: contiene tutte le componenti necessarie (1 prologo, 1 solo elemento radice,...) i suoi tag sono bilanciati, cioe' se ogni ogni tag aperto viene chiuso: <TAG>bla</TAG>; (se l'elemento e' vuoto: <TAG></TAG> <TAG/>) i tag sono "annidati" correttamente, cioe' l'ultimo tag aperto e' il primo ad essere chiuso: <TAG1><TAG2><TAG3>...</TAG3></TAG2></TAG1> Nota: XML (a differenza di HTML) e' case-sensitive! 1.3. Trasformazione con fogli di stile (XSLT) XSL (extensible Stylesheet Language) e' il linguaggio utilizzato per trasformare e visualizzare documenti XML. Non e' ancora completo, percio' attenzione! E' un complesso linguaggio per la formattazione di documenti che e' a sua volta un documento XML. Puo' essere ulteriormente suddiviso in due parti: trasformazione (XSLT) e formattazione di oggetti (qualche volta chiamati FO, XSL:FO o semplicemente XSL) Trasformazioni XSL (XSLT) Vedi doc "XSL muoviamo i primi passi.doc". Altri riferimenti: XML Bible: cap.14 revisionato, XML e java Import ed export tra java e file XML Le operazioni di import ed export consistono nel trasferire dei dati da una applicazione ad un file testo in formato XML e viceversa. L'operazione di export, da applicazione a XML, tramite Java e' semplicemente la scrittura su un flusso di uscita delle istruzioni in formato XML che contengono i dati nel formato specificato dal DTD del file XML

12 L'operazione di import invece consiste nel leggere un file XML, interpretarne la struttura ed estrarne i dati per l'applicazione, che poi li elaborera' come crede meglio (ad esempio li inserira' in un database...). Questa operazione ha visto lo sviluppo di "parser" che leggono il file XML e si occupano di interpretarne la struttura Parser SAX e DOM La tecnologia standard per accedere al contenuto di un documento XML attraverso applicazioni Java e' rappresentata dalle API DOM. Il Document Object Model puo' essere visto come un modello ad oggetti che incapsula il contenuto dei documenti XML. Esso contiene un insieme d'interfacce che ne descrivono la struttura. Attraverso queste interfacce, un'applicazione puo' direttamente aggiungere, modificare o cancellare i nodi di un documento XML. SAX (Simple API for XML) e' una tecnologia alternativa a DOM. SAX e DOM funzionano in modo totalmente diverso. SAX non e' un modello ad oggetti, per questo motivo non e' possibile interagire direttamente con i nodi XML. La filosofia di SAX e' la seguente: effettuare il parsing di un documento XML ed inviare un evento ogni qualvolta che un tag viene processato. Le applicazioni possono quindi "catturare" gli eventi e di conseguenza "fare qualcosa" Confronto tra parser SAX e parser DOM DOM effettua il parsing di un documento XML e crea un oggetto Document interamente in memoria. Document e' l'interfaccia fondamentale che consente di accedere al documento XML. Se per esempio l'xml contiene la seguente struttura <Impiegato> <cognome> Mario </cognome> <nome> Rossi </nome> <Indirizzo> <via> Via Roma 2 </via> <Citta> <nome> Napoli </nome> <cap> </cap> </Citta> <Stato> <nome> Italia </nome> <valuta> Lira/Euro </valuta> </Stato> </Indirizzo> <Reparto> <codice> B00311 </codice> <descrizione> Ufficio Personale </descrizione> </Reparto> </Impiegato> allora DOM creera' l'oggetto Document strutturato ad albero corrispondente. Attraverso questo oggetto possiamo usare e manipolare Impiegato, Indirizzo, Citta', Stato, Reparto e tutti gli attributi. E' importante notare bene che, dopo il parsing, non avremo a disposizione oggetti Java di tipo Impiegato, ma solo l'oggetto Document. Mediante navigazione possiamo accedere a tutte le informazioni che desideriamo. Se il nostro scopo e' quello di ottenere proprio istanze di Impiegato allora e' necessario un passaggio aggiuntivo: creare un oggetto Impiegato e copiare in esso i dati provenienti dall'oggetto Document. L'approccio adottato da SAX e' completamente differente. Nessun oggetto speciale sara' creato in memoria dopo il processo di parsing. Per questo motivo non ci sara' la possibilita' di accedere in modo diretto ai dati contenuti nel documento XML. E' compito nostro, in fase di parsing, memorizzare in qualche modo tutte le informazioni di cui abbiamo bisogno. Com'e' stato gia' detto, ogni volta che il parser processa un tag, sara' lanciato un evento. Il codice che gestisce l'evento avra' come parametri d'input il nome del tag e gli eventuali attributi XML. Gli eventi principali che SAX puo' lanciare in fase di parsing sono quattro: Start Document: Significa che il processo di parsing e' iniziato

13 End Document: Il processo di parsing e' finito. Start Element: Un tag sta per essere processato. e' stato riscontrato qualcosa del tipo <tagname>. End Element: Un tag e' stato processato. E' stato riscontrato qualcosa del tipo </tagname>. In questo momento siamo a conoscenza del valore associato. Intercettando questi quattro eventi saremo in grado di importare le informazioni provenienti dal file XML in oggetti Java. SAX non spreca tempo e memoria per creare un modello ad oggetti che dovra' risiedere interamente in memoria. Esso effettua semplicemente il parsing del documento e alla fine del processo, in base ai nostri handler degli eventi, avremo gli oggetti Java nel formato che desideriamo Parser DOM Esempio di import (con parser Sax) Si vuole poter inserire nell'agenda dei dati forniti da altri programmi di memorizzazione di agende che producono, a richiesta, un file XML con la sintassi specificata nel seguito. Everyone is using XML these days to share information over the Internet. It provides a platform-independent way to transfer data between computers and to specify configuration data for a system. Unlike HTML, which uses tags to describe the format of a web page, XML tags identify the data they contain. For instance, the following document, phonebook.xml, might describe someone's phone book: <PHONEBOOK> <PERSON> <NAME>George Bush</NAME> < >president@example.com</ > <TELEPHONE> </TELEPHONE> <WEB> </PERSON> <PERSON> <NAME>Joseph Cardinal Ratzinger</NAME> < >pope@example.com</ > <TELEPHONE>39 (6) </TELEPHONE> <WEB> </PERSON> <PERSON> <NAME>Tony Blair</NAME> < >pm@example.co.uk</ > <TELEPHONE> </TELEPHONE> <WEB> </PERSON> <PERSON> <NAME>Meg Whitman</NAME> < >ebay@example.com</ > <TELEPHONE> </TELEPHONE> <WEB> </PERSON> </PHONEBOOK> Here, the outermost tag of PHONEBOOK indicates we have a telephone book. Inside the phone book, you'll find a set of PERSON elements. And for each person, you'll find a name, address, telephone number, and web site address. Once you have an XML document, what can you do with it? That's where Java technology and the Java Platform, Standard Edition (Java SE, formerly known as J2SE) libraries come into play. Inside the standard libraries, you'll find support for transforming XML documents through XSLT and parsing XML documents through SAX or DOM. XSLT stands for Extensible Style Language for Transformation. By creating a second document that describes the transformations you wish done, you can take the first document's content and create a third. The Java technology libraries come with an XSLT processor to do the transformation. Essentially, the same program can be used to make lots of different transformations. The only - 9 -

14 thing that needs to change is the XSL file that describes the transformations. For instance, if you wanted to take the XML phone-book file and create an HTML table out of it, the transformation below would pull the name, address, and web address out of the XML file, sort the results, and send the results to the console. The following document, directory.xsl, describes just such a transformation. For each PERSON tag within a PHONEBOOK tag, grab the data from the NAME, TELEPHONE, and tag. <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl=" version="1.0"> <xsl:template match="/"> <html> <head> <title>directory</title> </head> <body> <table border="1"> <tr> <th>name</th> <th>telephone</th> <th> </th> </tr> <xsl:for-each select="phonebook/person"> <xsl:sort/> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="telephone"/></td> <td><xsl:value-of select=" "/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Following is the program that does the transformation: import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; public class Transform { public static void main(string args[]) { if (args.length!= 2) { System.err.println("Usage: java Transform xmlfile stylesheet"); System.exit(-1); try { StreamSource source = new StreamSource(args[0]); StreamSource stylesource = new StreamSource(args[1]); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newtransformer(stylesource); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); catch (Exception e) { e.printstacktrace(); And here is the result: <html> <head> <META http-equiv="content-type" content="text/html; charset=utf-8">

15 <title>directory</title> </head> <body> <table border="1"> <tr> <th>name</th><th>telephone</th><th> </th> </tr> <tr> <td>george </tr> <tr> <td>joseph Cardinal Ratzinger</td><td>39 (6) </td> </tr> <tr> <td>tony </tr> <tr> <td>meg </tr> </table> </body> </html> If you want to do more with the XML document besides just transform it, that's where SAX and DOM come into play. With SAX, or Simple API for XML, you make one pass through the document and react to events, like when a tag begins or ends. With DOM, or Document Object Model, the entire XML document is read into memory and essentially stored in a treelike data model. The SAX parser uses a callback mechanism that calls methods of the supplied DefaultHandler when a tag begins or ends. For instance, in the following program, whenever a NAME tag is found, the value is printed. import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; public class NameLister { public static void main(string args[]) { if (args.length!= 1) { System.err.println("Usage: java NameLister xmlfile"); System.exit(-1); try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxparser = factory.newsaxparser(); DefaultHandler handler = new DefaultHandler() { boolean name = false; public void startelement(string uri, String localname, String qname, Attributes attributes) throws SAXException { if (qname.equalsignorecase("name")) { name = true; public void characters(char ch[], int start, int length) throws SAXException { if (name) { System.out.println("Name: " + new String(ch, start, length)); name = false; ; saxparser.parse(args[0], handler); catch (Exception e) { e.printstacktrace(); Running the program with the command line:

16 java NameLister phonebook.xml will produce the following results: Name: George Bush Name: Joseph Cardinal Ratzinger Name: Tony Blair Name: Meg Whitman The basic framework of starting off with DOM is the same. When working with DOM, though, instead of using the SAXParserFactory from the javax.xml.parsers factory, you get a DocumentBuilder from the DocumentBuilderFactory. After parsing the input file, you have a tree that you can do whatever you like with, including adding new nodes, rearranging existing nodes, and saving the results in a new XML file. You can do much more with XML than is shown here. For more information, see Export Allo stesso modo, si vorrebbe poter esportare i dati dalla nostra applicazione in modo che sia possibile utilizzarli in altri programmi. Per fare cio' e' possibile produrre un file XML a partire dai dati inseriti nell'agenda. Il file di uscita questa volta non sara' binario ma di tipo testo, con lo stesso formato gia' utilizzato per l'import XML e i DBMS (...) 1.6. Autovalutazione dell'apprendimento Domande Cosa e' un linguaggio di markup? Quali sono le differenze essenziali tra XML e HTML? A cosa serve un parser? Quale e' il suo input? Che differenze ci sono tra parser SAX e parser DOM? In quali situazioni e' meglio utilizzare uno piuttosto che l'altro? Spiegare il funzionamento di un parser SAX Esercizi di autovalutazione Esercizio 1. Determinate se le seguenti affermazioni sono vere o false. Se sono false, spiegate il perche'. a: XML e' una tecnologia per creare linguaggi di markup. b: Il testo di markup e' delimitato dai simboli / (slash) e \ (backslash). c: I caratteri arabi possono essere inseriti nei documenti XML soltanto se si dispone di una tastiera araba. d: Diversamente da HTML, tutti i tag iniziali XML devono avere i corrispondenti tag finali. e: I parser controllano la sintassi dei documenti XML e possono supportare il modello DOM (Document Object Model) e/o il metodo SAX (Simple API for XML). f : Un documento XML e' considerato well formed se contiene dei caratteri vuoti (whitespace characters). g: Gli URI sono stringhe che identificano risorse come file, immagini, servizi, caselle di

17 posta elettronica e altro ancora. h: Quando creano nuovi tag XML, gli autori devono utilizzare i tag del linguaggio XML definiti dal W3C. i: I caratteri # (pound), $ (dollaro), & (e commerciale o ampersand), > (maggiore) e < (minore) sono caratteri riservati del linguaggio XML. j: Qualsiasi file di testo viene automaticamente considerato come documento XML da un parser. Esercizio 2 Completate le seguenti frasi. a: Un elabora un documento XML. b: I caratteri validi che possono essere utilizzati in un documento XML sono i carriage return (ritorno carrello), i line feed (avanzamento riga) e i caratteri. c: I riferimenti alle entita' devono essere preceduti dal carattere. d: Una e' delimitata dai caratteri <? e?>?>. e: Il testo che si trova all'interno di una non viene elaborato dal parser. f : Un documento XML e' considerato se e' sintatticamente corretto. g: I aiutano gli autori a evitare i conflitti di nomi. h: Le righe che precedono l'elemento radice di un documento XML formano il. i: Un tag non contiene dati di caratteri. j: I file dei documenti XML, di solito, hanno l'estensione. Esercizio 3 Identificate e correggete gli errori nelle seguenti istruzioni: a: <mio Tag>Un tag personalizzato<mio Tag> b: <!PI value!> <!-- esempio di istruzione di elaborazione --> c: <mioxml>i conosco XML!!!</MioXML> d: <CDATA>Una sezione CDATA</CDATA> e: <xml>x < 5 && x > y</xml> <!-- identifica una condizione Java **> Risposte agli esercizi di autovalutazione Esercizio 1 a: Vero. b: Falso. In un documento XML, il testo di markup e' delimitato dalle parentesi angolari < e >, con il simbolo / (slash) nel tag finale. c: Falso. I caratteri arabi possono essere inseriti in un documento XML utilizzando i riferimenti alle entita' dei corrispondenti caratteri Unicode. d: Vero. e: Vero. f : Falso. Un documento XML e' considerato well formed se e' sintatticamente corretto. g: Vero. h: Falso. Gli autori possono creare nuovi tag XML, utilizzando qualsiasi nome, tranne la parola riservata xml (XML XML, Xml e cosi' via). i: Falso. I caratteri & (e commerciale o ampersand), > (maggiore) e < (minore) sono riservati, mentre # e $ non lo sono. j: Falso. Il file di testo deve essere scritto in modo da superare i controlli sintattici del parser. Se il file di testo non supera questi controlli, non puo' essere considerato un

18 documento XML. Esercizio 2 a: parser b: Unicode c: & (e commerciale o ampersand) d: istruzione di elaborazione e: sezione CDATA f$list( ) well formed g: namespace h: prologo i: vuoto j: xml Esercizio 3 a: Il nome dell'elemento mio Tag contiene uno spazio. Il tag finale e' privo del simbolo / (slash). Questa e' l'istruzione corretta: <miotag>un tag personalizzato</miotag> b: I delimitatori dell'istruzione di elaborazione sono sbagliati. Il codice corretto e' questo: <?PI value?> <!-- esempio di istruzione di elaborazione --> c: Il codice corretto e' questo: <mioxml>i conosco XML!!!</mioXML> oppure <MioXML>I conosco XML!!!</MioXML> d: La sintassi corretta di una sezione CDATA e' questa: <![CDATA[Una sezione CDATA]]> e: Il nome xml e' riservato e non puo' essere assegnato a un elemento. I caratteri <, & e > devono essere rappresentati utilizzando le entita' di caratteri. Il delimitatore di chiusura del commento include due trattini, non due asterischi. Il codice corretto e' questo: <unnome>x < 5 && x > y</unnome> <!-- identifica una condizione Java --> Esercizi senza soluzione Esercizio 4: Create un documento XML che definisce il markup della tabella nutrizionale di una scatola di Biscotti della nonna Papera. Ogni confezione di biscotti ha i seguenti valori nutrizionali: contenuto energetico 260 calorie, 100 g di grassi, di cui 2 g di grassi saturi, 210 mg di sodio, 36 g di carboidrati, 5 mg di colesterolo, 2 g di fibre, 15 g di zuccheri e 5 g di proteine. Rappresentate il documento XML con Internet Explorer 5. Suggerimento: definite gli elementi XML che descrivono il nome del prodotto, la confezione, le quantita' di calorie, sodio, colesterolo, proteine e cosi' via. Create un elemento XML per ogni voce della tabella nutrizionale; annidate gli elementi, se necessario. Esercizio 5: Create il markup XML per il seguente codice Java. Rappresentate l'istruzione if con l'elemento iif, che contiene uno o piu' elementi condition e uno o piu' elementi statement. L'elemento condition contiene la condizione (per esempio, m==month && d==day day); l'elemento statement contiene un'istruzione (per esempio, DataRisultante="DATA: G " + d + " M " + m m). L'elemento else rappresenta un'istruzione else in Java e contiene uno o piu' elementi statement. Rappresentate il documento XML in Internet Explorer 5. 1 if ( ( m == month && d == day ) // m == month && d == day 2 ( month == -1 && d == day ) // month == -1 && d == day 3 ( m == month && day == -1 ) // m == month && day == -1 4 ( month > -1 && day <= -1 ) ) { // month > -1 && day <= -1 5 DataRisultante = "DATA: G " + d + " M " + m; // istruzione 6 processchildnodes(dateelement.getchildnodes());// istruzione 7 8 else // istruzione else 9 return; // istruzione

19 Esercizio 6: Modificate il documento del precedente esercizio inserendo il codice Java all'interno di una sezione CDATA. Rappresentate il documento in Internet Explorer 5. A parte la colorazione dei testi, il codice Java dovrebbe essere visualizzato esattamente come e' riportato nell'esercizio 5. Esercizio 7: Modificate il documento della Figura 5.10 in modo che ogni elemento note abbia gli attributi year year, month month, day e time time, anziche' gli elementi child. Il documento risultante dovra' contenere soltanto l'elemento radice e gli elementi child note note. Esercizio 8: Scrivete il foglio stile CSS per il codice del primo esempio visto nella spiegazione in modo che il testo del messaggio (Benvenuti in XML! XML!) sia visualizzato con il font Times 20 punti di colore blu Trucchi XSLT Uso delle costanti: Sono definite con xsl:variable hanno scopo che dipende da dove sono definite: se sono nel blocco piu' esterno sono globali, altrimenti via via piu' locali Ambienti di sviluppo Microsoft e XML Microsoft ha adottato lo standard XML+XSLT ufficialmente ed il parser versione 3.0 e' compatibile. Internet Explorer 5.5 non visualizza i documenti XML che si appoggiano su un XLST Scaricati dal sito Microsoft MSXLS parser 3.0 SP1 Internet Explorer Tools for Validing XML and View XSLT Output MSXSL.EXE Command Line Transformation Utility MSXML SDK 3.0 Release Per vedere la trasformazione in un file separato (utile per evitare di installare il parser in Explorer): /bin/msxsl file.xml file.xsl -o output_file. Attenzione: il file di uscita ha strani caratteri (almeno visti da type/edit) Oracle Software: xmlparser_v1_0_2_2.tar.gz cxmlparser_linux_v1_0_1.tar.gz c:\software\xdk_java_8_1_7_1.tar.gz - Oracle XML Developer's Kit for Java on Unix (vedere Doc) Documentazione: C:\Users\Documentazione\OracleXml\OTN-intro_file\xml_twp.htm: XML Support in Oracle8i and Beyond C:\Users\Documentazione\OracleXml\OTN-xml1_file\about_xml.htm: Using XML in Oracle Database Applications Part 1: About XML C:\Users\Documentazione\OracleXml\OTN-xml2_file: Using XML in Oracle Database Applications Part 2: About Oracle XML Products C:\Users\Documentazione\OracleXml\OTN-xml3_file\xml_custom_presentation.htm:

20 Using XML in Oracle Database Applications Part 3: Customizing Data Presentation C:\Users\Documentazione\OracleXml\OTN-xml4_file\xml_data_exchange.htm: Using XML in Oracle Database Applications Part 4: Exchanging Business Data Among Applications C:\Users\Documentazione\OracleXml\a86030-xmldev.pdf: Oracle 8i Application Developer's Guide - XML Release 3 (8.1.7) September 2000, Part No. A NB 1300 Pagine!!! C:\Users\Documentazione\OracleXml\Building Oracle XML Applications Chapter 7 Transforming XML with XSLT.htm: Building Oracle XML Applications By Steve Muench, September 2000, Chapter 7: Transforming XML with XSLT 1.9. Bibliografia essenziale XSL Sito ufficiale: link( I documenti estratti sono sotto c:\users\documentazione\xml. Inoltre: Document Object Model (DOM) Level 1 Specification PRINTED Document Object Model (HTML) Level 1 PRINTED JAVA e XML Autore: Brett McLaughlin. Bel libro anche se non aggiornatissimo XML Bible Libro, sulla rete sono disponibili gratuitamente alcuni capitoli (v. C:\users\Documentazione\XML). XSL Transformations.htm (XML Bible cap 14) PRINTED. XSL Formatting Objects.htm (XML Bible cap 15) File in: Users/Documentazione/XML. Extensible Markup Language (XML) 1_0 (second Edition).html PRINTED. namespace in XML.htm PRINTED. XML Schema Formal Description.htm PRINTED. XLS Transformations (XSLT).htm PRINTED (?) File in: Users/Documentazione/XML. XSL Element Reference (W3C).mht descrizione formale della sintassi xslt. XSL Transformation.mht XSL-Concepts-and-pratical-Use-Slides.htm File in: Users/Documentazione/XML. Corso di xsl LGEI N_ 1 Anno IV - Linux, Java e XML.htm (da Linux Gazzette) Articolo di Eoin Lane con esempio. IMPORTANTE per l#installazione di cocoon e Apache su Linux

21 PRINTED. File in: C:\users\documentazione\linuxXML msdn.microsoft.com usato per scaricare gli add-on per IE 5.0 e successivi Documentazione: Vedi quaderno XML, comprende un tutorial con esempio (PRINTED) technet.oracle.com Vedi file in Users\Documentazione\OracleXML Oracle XML Developer#s Kit: PRINTED. contiene la lista della documentazione disponibile sotto Oracle. Using XML in Oracle Database Applications: PRINTED XML schema Internet News nov 99. Articolo di Dario de Judicibus (Internet News Nov 99) Computer programming CP 83 p.70: Introduzione a XML (IE 5 era ancora beta) CP 95 p.71: Parser per XML: API Java e C CP 95 p.58: XLS Fa riferimenti a IE. CP 98 p.16: XLS: fu vera gloria CP 98 p.35: da XML a HTML passando per XSLT DEV Tools di sviluppo XML: DEV 83 p.62 Java & XML: DEV 84 p.51 1.a parte, DEV 85 p.48 2.a parte XML e JAVA Trasformazione di documenti XML in applicazioni Java tramite XSL: PRINTED link relativo: /2000/12xsljava.htm