XML ovvero trasformando tutta l'informazione online in un'unico database

   L'enorme successo del Web ha portato a un ripensamento di tutta l'informazione online con lo scopo preciso di trasformarla in un'unico database. E' il sogno del Web semantico di Tim Berners Lee , per la cui realizzazione il primo passo e' la codifica in xml dei documenti online e la realizzazione di servizi web. Ma l'xml e' ormai diventato uno standard per la rappresentazione e lo scambio di qualsiasi tipo di dati , online o no, cambiando per sempre l'attivita' del programmatore.

Questo documento e' stato usato in un seminario tenuto il giorno 8 Luglio 2004 nel Dipartimento di Fisica di Bari . Suggerimenti e commenti sono graditi: spediteli a info@zitogiuseppe.com.



Materiali usati nel seminario

Indice

Introduzione

Un rapido esame dello stato attuale del Web e di Internet mostra alcune stupefacenti caratteristiche.Solo circa 1/1000 dell'informazione online e' classificata da un motore di ricerca come Google perche' il resto dell'informazione non e' in un formato accessibile.L'informazione non e' classificabile perche' non e' in formato html e/o perche' e' in un normale database.Ma anche i documenti in html non permettono di ricavare informazioni che pure sarebbero utilissime:l'html e' adatto alle persone non ai computer.Questo ha portato all'idea di un salto di qualita':trasformare tutta l'informazione online in formato classificabile.Passare dall'html a un formato piu' adatto ai computer. Sono nati cosi' l'xml e i servizi Web.Questo sta producendo una nuova trasformazione di Internet: ad esempio 2 dei maggiori siti Web Amazon e Google forniscono ora un servizio web per interrogare in maniera automatica i loro database. Inoltre sempre piu' siti Web si basano su xml.
Perche' usiamo Java Le tecnologie per trattare xml e servizi web sono ormai disponibili in ogni linguaggio di programmazione inclusi quelli di scripting come PHP, python e perl.Ma se consideriamo lo sviluppo di servizi web "seri" e non solo a livello dimostrativo, allora abbiamo in pratica due sole alternative: la piattaforma Java che qui vedremo in dettaglio e la piattaforma .NET (dotnet) di Microsoft.Per quanto quest'ultima usi strumenti diversi (di solito indicati con .net) i protocolli usati sono gli stessi.Invece dietro la "piattaforma Java" non c'e' solo la Sun ma anche altri big come IBM(Websphere), Oracle, Macromedia,etc che hanno contribuito allo sviluppo della piattaforma. Inoltre c'e' il contributo dell'open source soprattutto col progetto Jakarta di Apache a cui si devono tra l'altro Tomcat,Castor,Axis e Struts.
Dobbiamo comunque aggiungere che i linguaggi di scripting stanno acquistando sempre piu' importanza:non fosse altro che per la loro semplicita' d'uso. Per questo,nelle pagine che seguono, faremo vedere qualche esempio in PHP. Essi sono inoltre in alcune applicazioni, perfettamente adeguati ed inoltre la loro efficienza aumenta sempre piu' cosi' da fare sempre piu' concorrenza alle soluzioni "serie" qui descritte.
Infine sull'uso di Java per realizzare applicazioni Web guardate anche questo: Applicazioni Web in Java : perche' tante tecnologie?.

Un vecchio problema, una nuova soluzione

La gestione di una rubrica telefonica di una piccola organizzazione e' ormai un problema classico.All'inizio si e' cominciato con lo scrivere l'elenco in html con tutti i problemi che nascevano quando si dovevano fare frequenti modifiche o si voleva cambiare il formato. Poi si e' passati alla soluzione Web+database ad esempio PHP+mysql. Certo un grande miglioramento . Ma che fare ad esempio nel caso del nostro Dipartimento in cui sia il server dell'Universita' che il server INFN mantengono le loro rubriche riguardanti le stesse persone! La comunicazione tra le 2 istituzioni e' complicata e non puo' essere risolta con un'unico database centralizzato. Bisogna ripensare il tutto! Qui entra in ballo l'xml che e' stato creato proprio per permettere a istituzioni diverse di scambiarsi dati.Lo scambio dei dati avviene attraverso i cosiddetti servizi web. Potete pensare ai servizi web come l'equivalente del web server nell'era del web semantico quando tutta l'informazione sara' in xml .Essi servono inoltre a realizzare applicazioni distribuite che come il web , applicazione distribuita per eccellenza, scalano senza problemi.
La proprieta' che i vari servizi Web possano comunicare tra di loro indipendentemente dalla piattaforma, viene chiamata interoperabilita' ed e' la maggiore caratteristica dei servizi web basati su xml. Si possono vedere percio' online delle tabelle per "certificare" l'interoperabilita' dei vari toolkit usati per creare tali servizi.

All'inizio fu l'xml

Se l'html e' stato uno dei fondamenti del successo del Web , l'xml e' la base di questa nuova fase di Internet.L'xml non e' un programma ne' un database. Non dice niente su come vanno processati i dati relativi alle persone.E' solo una serie di specifiche che dicono come i dati della rubrica telefonica vanno resi disponibili online. La forma assomiglia all'html: formato testo con comandi di marcatura (tag) racchiusi da parentesi angolari.La grande novita' e' che ora i comandi potete inventarli voi. I webmaster di www.ba.infn.it e di www.fisica.uniba.it si incontrano e decidono di usare i comandi <nome> , <cognome>,etc cosicche' la rubrica puo' essere rappresentata da questo file di testo.

In definitiva l'xml e' uno standard che ci permette di definire nuovi linguaggi di marcatura.Questi linguaggi di marcatura permettono di rappresentare informazione strutturata in un formato testo che si descrive da se e che e' adatto allo scambio della stessa tra computer e programmi e quindi tra organizzazioni. Il set di caratteri usato ,detto Unicode, permette di rappresentare testi nei principali alfabeti mondiali.

Il formato dei documenti XML e' definito da un documento del comitato W3C(diventato una raccomandazione nel Febbraio 1998) ed ha una struttura gerarchica ad albero. Questa struttura segue il cosiddetto DOM (Document Object Model).Un Documento xml e' fatto da nodi di vario tipo.I nodi piu' comuni sono i nodi elemento che contengono un comando di marcatura tra parentesi angolari o tag di apertura e un tag di chiusura. I nodi testo sono invece le stringhe racchiuse tra un tag di apertura e uno di chiusura.Ogni elemento puo' avere uno o piu' attributi sotto forma di nomeattributo="valoreattributo". Da notare che in alcuni casi e' possibile rappresentare un'informazione sia come elemento che come attributo di un elemento. Nel caso della rubrica possiamo ad esempio rappresentare la singola persona come un unico elemento con differenti attributi:


<persona nome="Mario" cognome="Rossi" tel="3333" email="mario.rossi@qualcheparte.it" homepage=""  />
Il linguaggio di marcatura puo' essere definito in maniera implicita come in questo caso. Oppure possiamo descriverlo in maniera esplicita usando un'apposito linguaggio di marcatura XML Schema(esiste anche un modo diverso di descrivere lo schema detto DTD:Document Type Definition che pero' sta diventando (forse) obsoleto).Descrivere in maniera esplicita lo schema o sintassi di un linguaggio di marcatura permette di controllare la sintassi dei documenti scritti validandoli.In seguito vedremo dei documenti scritti con linguaggi di marcatura che hanno il seguente schema.

Se guardate questo documento scritto anch'esso in xml, noterete che tutti i comandi sono preceduti dalla scritta "xsd:". Questa scritta separata dal carattere ":" che talvolta compare per alcuni comandi, serve a indicare il namespace dei comandi: cioe' il particolare linguaggio di marcatura usato. In questo modo possiamo usare gli stessi comandi (e attributi) in due linguaggi di marcatura diversi e usarli nello stesso documento senza pericolo di confusione.I namespace usati sono di solito indicato nel root element ovvero il comando che racchiude l'intero documento xml come valore dell'attributo xmlns= per indicare il namespace di default , e come valore dell'attributo xmlns:pippo= per indicare il namespace pippo .Il valore di questo parametro e' un URI che non deve necessariamente corrispondere a un documento esistente. Infatti questi indirizzi sono solo degli identificatori e il loro unico scopo e' di identificare in maniera univoca il namespace. .

In definitiva un documento xml e' fatto da elementi contenenti a loro volta attributi.A ogni elemento corrisponde un tag di apertura e un tag di chiusura. I vari elementi sono disposti in una gerarchia a partire dall'unico elemento radice.I nomi degli elementi e degli attributi possono provenire da namespaces (vocabolari) diversi) indicati da un prefisso e definiti nell'elemento radice da un indirizzo web(URI).

Se siete abituati a scrivere html a mano con un'editore di testi potete subito scrivere xml con lo stesso editore. Dovete solo tener presente queste piccole modifiche rispetto all'html:
  1. Per i tag maiuscole e minuscole contano : <prova> e' diverso da <PROVA>
  2. A un tag di apertura deve sempre corrispondere un tag di chiusura.
  3. Potete scrivere un elemento vuoto nella forma abbreviata <tel/> che corrisponde a <tel></tel>
  4. Tutto il documento deve essere racchiuso tra un unico tag di apertura e uno di chiusura(elemento radice).
  5. I valori di attributi vanno sempre racchiusi tra doppi apici.
  6. La prima riga deve indicare la versione xml e il set di caratteri usato: di solito
    <?xml version="1.0" encoding="UTF-8"?>
    
  7. I commenti si scrivono come in html racchiudendoli tra <!-- e -->
  8. Definite nel tag di apertura dell'elemento radice eventuali namespace a cominciare da quello di default con l'attributo xmlns oppure xmlns:nome.

Il primo obiettivo:trasformare tutta l'informazione in xml

Questa e' un'operazione gigantesca che e' in atto adesso un po' dovunque: Tra i nuovi formati xml un'importanza particolare ha il formato XSL-FO (eXtensible Stylesheet Language Formatting Objects) che , come si capisce dal nome, e' strettamente collegato a XSLT(di cui parleremo in uno dei prossimi paragrafi) e proviene anch'esso dal consorzio W3C .Esso serve a facilitare la formattazione dei contenuti xml per la successiva presentazione all'utente. In effetti facilita la trasformazione da xml a pdf,ps,word,etc... . Invece di fare la trasformazione in un'unico passo , si procede a creare con XSLT un documento FO e questo poi puo' essere convertito in uno dei piu' popolari formati di stampa e presentazione da appositi programmi.Questo risolve una volta per tutte un'annoso problema di html che veniva ritenuto inadatto per la stampa o la presentazione. Potete vedere in questo schema come XML-FO (in bianco al centro) , si situa tra xml, latex e pdf.
Come esempio di uso di questa tecnica ecco un servlet che converte a volo la nostra lista di persone utilizzando queste specifiche XSL-FO.

Anche il format SVG ha un valore particolare in quanto va visto come il formato specializzato per la presentazione grafica di informazioni XML (una specie di PowerPoint o Flash dell'xml). Come esempio ecco la rappresentazione grafica di un xml contenente una sequenza di numeri ottenuta con queste specifiche XSLT che producono questo codice SVG.

Il web semantico : una babele di tecnologie

Il vecchio Web quello si era facile da definire Web=HTML+URL+HTTP.

Il nuovo Web si presenta invece con una sequenza incredibile di nuove tecnologie tra le quali e' difficile raccapezzarsi:

Web semantico = XML + DOM + XML Schema + XSLT + XPath + XQuery + SOAP + WSDL + UDDI + ...

Per capirci qualcosa e' meglio basarsi su un fondamento sicuro : l'XML e classificare queste tecnologie e standard in termini di operazioni sull'XML. Cosi' abbiamo:

I servizi Web si basano su 3 protocolli principali: SOAP,WDSL e XML Schema. Da notare che SOAP e' solo la specifica di come si forma un messaggio per fare richieste in xml e ricevere risposte.In SOAP non viene indicato ne' come deve essere codificata l'informazione da trasmettere (il cosidetto payload) ne' come deve essere trasmessa.Esso fornisce solo la "busta" (Envelope) per spedire i dati XML o messaggi. Infatti un servizio Web puo' essere definito come un sistema di messaggeria che permette l'invio di messaggi tra oggetti. I messaggi possono essere sincroni o asincroni. Per specificare la codifica dei dati da inviare si usa XML-Schema. La descrizione in Xml-Schema e' contenuta in un documento WDSL.Questo documento viene anche usato per indicare uno stile RPC(remote procedure call) o Document di invocare il servizio.Nello stile RPC gli oggetti da spedire in seguito all'invocazione di un metodo remoto possono essere serializzati in maniera arbitraria; mentre nello stile Document gli oggetti da inviare sono descritti direttamente con XML-schema. Nello stile document il servizio si usufruisce infatti nel modo seguente: il client invia direttamente un documento xml per la richiesta e riceve un documento xml per risposta . Nello stile rpc invece il client richiama un metodo remoto ed eventuali oggetti inviati in risposta alla richiesta sono automaticamente mappati su oggetti locali (deserializzazione).
Versioni,versioni,... Ognuno dei vari protocolli e' a uno stadio diverso di maturazione, con diverse versioni. XML 1.0 , XML 1.1, Namespaces 1.0 , Namespaces 1.1 ,DOM 1, DOM 2, DOM 3 ...
Cosi' il software in alcuni casi si sta adeguando, in altri casi sta diventando obsoleto.Sax1, Sax2..,
Riporto qui solo un breve riepilogo della situazione a meta' 2004 per quanto riguarda gli standards dei Web services:
  • XML 1.0 stabile, ebbene XML-Schema sta per sostituire DTDs (attualmente si lavora a XML- Schema 1.1 ).Da notare che nei servizi web si usa solo XML-Schema per definire il tipo di dati da inviare.
  • SOAP 1.2
  • WSDL 2.0 (in arrivo, 1.2 in funzione)
  • UDDI versione 3 (Agosto 2003)

Corso accellerato su come estrarre informazioni da un file xml

Nonostante il formato xml sia stato studiato per il computer, e' di facile comprensione anche per le persone. Ma l'informazione che viene rappresentata non sempre e' una tabella : puo' avere una struttura molto complessa rappresentata da molti file xml collegati tra di loro come i documenti Web. Inoltre per descrivere cio' che ci interessa possiamo aver bisogno di piu' di un linguaggio di marcatura xml.

Come esempio piu' complesso consideriamo questa descrizione di un rivelatore di alte energie : la descrizione e' contenuta in 5 files conf.xml , specs.xml, tb.xml, tracker.xml e materials.xml. Questi files usano 2 linguaggi di marcatura chiamati CDL e DDL descritti in questo documento.

Ormai esistono centinaia di programmi che permettono di trattare l'xml per cui e' difficile che abbiate bisogno di scrivere voi un programma per fare questo. Ma nel caso ne abbiate bisogno potete immaginare come estrarre dati da un gruppo di file xml non sia proprio facile come leggere un file di testo. Avete bisogno di una buona API che ci permetta di navigare nella struttura creata dai comandi xml e dai link tra un file e l'altro. Uno dei linguaggi piu' attrezzati per questo scopo e' Java col suo Java API for Xml Processing (JAXP) e con programmi come Castor o JAXB.

L'operazione di estrarre informazioni da un file xml viene detta in gergo parsing ed esistono due maniere di fare il parsing: la maniera Sax e la maniera Dom. In alternativa potete usare anche una maniera magica nel senso che, dopo aver generato in maniera automatica le classi che vi servono per caricare i dati a partire dallo schema, il caricamento degli stessi avviene con un'unica operazione detta in gergo di marshalling.

La maniera Sax(Simple Api for XML)

Il piu' semplice programma Sax lo trovate qui.

Scaricate questo programma sul vostro computer e compilatelo dando il comando:

javac Loadxml.java
. A questo punto potete eseguirlo su un qualsiasi file xml dando il comando:
java Loadxml nomefilexml
.Ecco il risultato processando la nostra rubrica. In termini tecnici si dice che il programma ha fatto un parsing del file xml e dandovi il controllo nei metodi startDocument ,endDocument, startElement, endElement and characters vi permette di estrarre i dati dal documento. A titolo di cronaca quello usato in questo programma e' un parsing semplificato detto SAX per contrapporlo al parsing completo DOM in cui viene ricostruita la struttura completa del documento xml.

Avendo questo programma come base non e' difficile estrarre dei dati da un singolo file xml. Ecco alcune semplici modifiche:

La maniera Dom

Il parsing SAX in alcuni casi non e' sufficiente e bisogna procedere al parsing DOM dove le librerie Java cercano di ricostruire l'albero completo che rappresenta il documento (infatti DOM sta per Document Object Model). Questo albero lo potete vedere gia' nella rappresentazione che viene fatta dalle versioni piu' recenti di browser come Mozilla 1.2.(Se col vostro browser non ci riuscite, potete vedere qui l'inizio della lista). Si tratta di una gerarchia di nodi disposti a 4 livelli. Una rappresentazione piu' accurata dell'albero potete averla usando questo programma Java preso dal tutorial Sun. Dopo averlo compilato, fatelo eseguire con:
java DomEcho02 Persone.xml
.Ecco il risultato. Useremo una versione estremamente semplificata di questo programma come base per estrarre dei dati dai file XML usando il parsing DOM.Un oggetto Document rappresenta l'intera struttura gerarchica del documento. Se guardate in questo programma il metodo list vedrete che richiama dei metodi come child(n) per scendere al nodo figlio n, childCount() per sapere quanti figli ha un nodo, getName per ottenere il nome di un nodo , getValue per ottenere il contenuto di un nodo. Quindi se persona punta al nodo radice della singola persona, persona.child(9).child(0).getValue() ritorna l'indirizzo dell'homepage di quella persona. Ecco alcuni esempi:

La maniera magica

Ricapitolando, abbiamo visto come un documento xml puo' essere trasformato in una serie di eventi SAX oppure in un albero DOM.

Infine esiste una maniera magica di ottenere lo stesso risultato di estrarre e modificare i dati.(In gergo si chiama xml data binding).Questa maniera richiede uno speciale programma chiamato Castor oppure in alternativa JAXB, JDO o JDOM. Abbiamo chiamato magica questa maniera di manipolare documenti xml, perche' il programma Java che serve a manipolare i dati xml viene creato in maniera automatica a partire dallo schema del documento. Il programmatore Java puo' manipolare i dati senza bisogno di conoscere DOM e SAX. Il documento xml diventa un semplice contenitore Java che possiamo modificare a nostro piacimento e riscrivere come xml quando abbiamo finito.Alcuni di questi sistemi "magici" arrivano al punto da assicurare anche la persistenza degli oggetti creati a partire dal file xml in un database relazionale, anche questo in maniera automatica.

Nel nostro esempio useremo Castor e cercheremo di scrivere un programma che legge persone.xml lo controlla sintatticamente e quindi genera un file personeWithHomepage.xml con le sole persone che hanno una homepage. Ecco i passi da seguire:

  1. Scaricare castor-0.9.5.3.tgz dal sito di Castor: cioe' la tarball dell'ultima versione che va scompattata sul proprio computer.
  2. Definite la sintassi del documento che volete processare nel file persone.xsd.
  3. Fate un cd nella cartella principale di castor e copiate qui i file persone.xml e persone.xsd.
  4. Definite un classpath con tutte le librerie necessarie come questo:
    setenv CLASSPATH castor-0.9.5.3.jar:castor-0.9.5.3-xml.jar:jta1.0.1.jar:jdbc-se2.0.jar:/usr/local/tomcat/common/endorsed/xercesImpl.jar:/usr/local/tomcat/common/endorsed/xmlParserAPIs.jar:.:/home/zito/temp/castor/temp 
    
    Da notare l'aggiunta di xerces (qui preso dall'installazione di Tomcat). Inoltre dovete avere java 1.4 installata.
  5. Create una sottocartella cartella temp e date il comando:
    java -cp $CLASSPATH org.exolab.castor.builder.SourceGenerator -i persone.xsd -dest temp 
    
    Castor vi crea dei file .java nella cartella temp
  6. Aggiungete alla cartella temp il programma ListPersone.java
  7. Compilate il contenuto della cartella temp con:
    javac temp/*.java -d .
  8. Eseguite il programma ottenuto con:
    java -cp $CLASSPATH ListPersone persone.xml
    Il risultato di questa esecuzione oltre ad una stampa, sara' appunto personeWithHomepage.xml

Cos'e' questo schema e perche' e' cosi importante?

Lo schema di un linguaggio di marcatura non e' altro che la definizione del significato dei tag e attributi usati.
Per quanto si possa lavorare con documenti xml senza bisogno di definirne lo schema, il fatto di definirlo in maniera esplicita in un file xsd ci permette di utilizzare una serie di tool automatici altrimenti inutilizzabili. Abbiamo gia' visto nel precedente paragrafo come Castor sia in grado a partire dallo schema della nostra rubrica telefonica, non solo di validare i dati ma di generare automaticamente le classi che permettono di trattare i dati della rubrica in un programma.Lo schema veniva prima descritto in DTD ( ecco un altro esempio che descrive i dati esportati da un database Oracle). Ma adesso si usa XML-Schema che e' anch'esso in xml! Se guardate lo schema della rubrica potete vedere che e' semplice e usa come root il tag schema.All'interno potete definire i tag usati nella rubrica come una serie di nodi element l'uno dentro l'altro in modo da seguire la struttura gerarchica del documento. Il nome del tag e' indicato dall'attributo name. Possiamo avere elementi di tipo complesso e di tipo semplice (quest'ultimi corrispondono alle foglie dell'albero del documento.

I tipi complessi vergono definiti col tag complexType e il tag sequence specifica che i figli devono essere nell'ordine prefissato. In alternativa potevamo avere all cioe' l'ordine non e' importante oppure choice cioe' uno o piu' figli possono anche mancare.

La descrizione degli elementi di tipo semplice prevede la dichiarazione del tipo di dato con l'attributo type. Inoltre e' possibile definire una serie di restrizioni sul numero minimo e massimo di elementi.
Tra i software piu' usati per fare parsing e validazione c'e' Xerces open-source e disponibile sia in Java che C++.

Pubblicare la nostra rubrica su Internet: facile come XSLT

Il problema di far vedere l'xml in un browser puo' essere risolto in vari modi. La maniera piu' immediata e' quella di usare XSLT cioe' definendo le trasformazioni da fare nel cosiddetto eXtensible Stylesheet Language.Ecco il risultato con questo programma XSLT. Il programma XSLT viene eseguito in questo caso direttamente dal browser cioe' dal lato client. Ma la stessa cosa potrebbe avvenire dal lato server.Questo vi permette di creare un intero sito formato solo da documenti xml e poi far vedere ai navigatori le stesse pagine in html.Questo e' quello che fa Cocoon che trasforma ad esempio questo file xml in questa pagina html.

Il linguaggio alla base dei fogli di stile XSLT e' un linguaggio di programmazione di tipo particolare che invece di descrivere come fare per ottenere il risultato da applicare, descrive le regole da applicare ai nodi del documento. Nell'esempio visto prima abbiamo una sola regola definita dal tag template. I nodi a cui deve essere applicata la regola sono indicati dall'attributo match. Il filtro che seleziona i nodi e' a sua volta espresso in un linguaggio detto XPath. Questo linguaggio usa una sintassi simile a quella con la quale si selezionano files in una linea di comando Linux . Solo che ora invece di selezionare cartelle e file, selezionamo il percorso dei nodi nel nostro albero. Il tag for-each permette di filtrare tutti i nodi con una particolare caratteristica. Mentre value-of e' un esempio di tag che estrae dati dal documento originale .
Ecco altri esempi di trattamento della stessa lista di persone:

Possiamo fare le stesse operazioni fatte dal browser usando il seguente programma java che va invocato scrivendo
java trasforma foglio_di_stile file_xml
Questo programma usa il software open-source Xalan per fare la trasformazione. Xalan e' disponibile anche in C++.
XSLT puo' lavorare (assieme a XPath) su piu' file di input xml contemporaneamente. Se questi files contengono l'equivalente di tabelle relazionali, allora e' possibile realizzare con XSLT e XPath l'equivalente di Query SQL su queste tabelle.

Da notare che XSLT e' la maniera piu' semplice per estrarre o manipolare i dati di uno o piu' file xml. In alcuni compiti ci evita di dover scrivere programmi appositi con parsing SAX o DOM. Tutto quello che dobbiamo fare e' avere un motore XSLT come un browser o il programma Java prima visto e scrivere il nostro programma come un file xml con specifiche xslt. Nessuna necessita' di conoscere Java o C++. Quindi XSLT , XPath e XQuery permettono l'accesso e la manipolazione di dati xml esattamente come le Api Dom e Sax prima viste. Solo che il tipo di accesso ottenuto con XSLT e' a piu' alto livello. E' la stessa differenza che si ha , nei database relazionali, tra l'accesso con SQL e l'accesso con un'Api come JDBC.

XSLT o XSL? Nei documenti che parlano dei fogli di stile XSLT c'e' spesso confusione perche' si parla di un misterioso linguaggio XSL e non si capisce cosa sia. La confusione e' accresciuta dal fatto che talvolta si indica con XSL cio' che invece andrebbe chiamato XSL-FO : di XSL-FO abbiamo gia' parlato definendolo come un particolare formato XML intermedio usato per trasformare xml in pdf, rtf, ps e altri formati di presentazione. Per generare da xml xml-fo si usano dei fogli di stile in cui compaiono delle specifiche definite dal seguente namespace xmlns:fo="http://www.w3.org/1999/XSL/Format". Ovviamente il foglio di stile contiene anche specifiche del namespace usato normalmente da XSLT xmlns:xsl="http://www.w3.org/1999/XSL/Transform" I due namespace provengono ambedue da W3C .Ambedue i namespace realizzano in parte il linguaggio XSL. Per cui la relazione tra XSL e XSLT + specifiche XSL-FO e' quella tra il tutto e le parti. XSLT e' la parte Trasformazioni dell'xsl , mentre XSL-FO e' la parte Formattazione.In ogni caso W3C non considera ancora l'implementazione di XSL completa.

Gestire la nostra rubrica su Internet:due soluzioni possibili per un servizio web

Ora che la nostra rubrica e' in formato xml e facilmente accessibile da un programma, arriviamo al problema concreto che prima veniva risolto con PHP e mysql: come faccio a gestire la mia rubrica? Abbiamo bisogno di qualcosa che ci permetta di creare, aggiornare e leggere la rubrica. Qualcosa che sia accessibile via Web. I servizi Web sono stati introdotti proprio per questo. La differenza essenziale tra la soluzione database+web e servizio Web basato su xml e' che col servizio Web non si fa nessuna assunzione su come si fara' a gestire la rubrica. Si definisce solo un'interfaccia Web per l'utente: come questa sara' realizzata non ha importanza.Nel caso della rubrica non facciamo nessuna assunzione su chi gestira' la rubrica, su dove saranno i dati, etc La gestione potrebbe essere fatta benissimo da ambedue i siti INFN e Universita' ed ognuno potrebbe usare una tecnica diversa di gestione con o senza database: l'utente vede solo che e' disponibile un servizio , se usa il corretto protocollo potra' gestire i dati. Attualmente la realizzazione di un servizio Web viene fatta seguendo due approcci : nel primo approccio basato su SOAP vengono usati nuovi protocolli introdotti da W3C appositamente per realizzare servizi Web. Nel secondo approccio detto REST si usano invece i protocolli gia' esistenti per realizzare un servizio Web. Ad esempio Amazon ha fornito un'interfaccia per l'interrogazione del suo catalogo che e' realizzata come servizio Web in ambedue i modi. Viceversa Google fornisce un'interfaccia analoga ma solo nel formato SOAP. La giustificazione principale dell'approccio REST e' quello di una maggiore efficienza e scalabilita'.

La descrizione del servizio Web viene fatta in un particolare linguaggio xml detto WDSL e resa disponibile a tutti via Internet. Ecco ad esempio la descrizione del servizio Web di Google.Un client SOAP manda una richiesta con un POST http al indirizzo del servizio ottenendo come risposta il seguente documento.La risposta nell'approccio SOAP richiede un server SOAP come ad esempio Axis+Tomcat.

Soluzione 1: interfaccia SOAP(Simple Object Access Protocol)

Nella prima soluzione l'interfaccia Web viene definita come un'API di programmazione ad oggetti: una serie di oggetti e metodi che possono essere richiamati da un cliente remoto.Il cliente ,conoscendo i metodi ed oggetti disponibili, invia una richiesta usando il linguaggio SOAP al fornitore del servizio che risponde inviando un file xml. La richiesta stessa e' un codice xml che permette di rappresentare chiamate a metodi remoti. Ad esempio per la rubrica, l'oggetto potrebbe essere Rubrica e i metodi Rubrica.list, Rubrica.insert, Rubrica.create, etc Questo approccio richiede un client SOAP per inviare la richiesta e processare la risposta.

Se a qualcuno tutto questo ricorda CORBA o RMI , non c'e' da meravigliarsi, SOAP , a parte l'XML, rimpiazza proprio queste tecnologie che erano state inventate per poter richiamare metodi di oggetti remoti e far viaggiare gli stessi oggetti attraverso internet.

Come abbiamo gia' visto prima ci sono due tipi o stili di servizi SOAP : quello orientato ai documenti e quello orientato alla chiamata di procedure remote(rpc).Se guardate questa lista di servizi il tipo e' indicato nella colonna Style. Sempre da questa lista potete vedere la principale differenza tra i 2 tipi : nel tipo rpc il servizio e' una lista di metodi ad ognuno dei quali corrisponde un Endpoint URL e uno o piu' Input e Output Parameters. Nel tipo documento invece , il servizio si caratterizza come una lista di operazioni per ognuna delle quali e' definito un InputMessage e un OutputMessage.Potete pensare alle singole operazioni dello stile document come dei metodi che hanno un unico parametro di input e un'unico parametro di output.Questi parametri sono stringhe di caratteri contenenti documenti xml.Cioe' ,in termini di oggetti, possono rappresentare dei contenitori di oggetti.

Fornire un servizio Web con SOAP e' abbastanza complicato perche' richiede un server Web che sappia trattare SOAP,WDSL e XML Schema. Ci sono vari sistemi che cercano di semplificare la vita, ma prima di vederne qualcuno in particolare, cerchiamo di vedere cosa andrebbe fatto:

Noi useremo per l'implementazione degli esempi , Java con Tomcat e Axis (+ Castor in alcuni casi). Questo richiede l'installazione di questi 3 pacchetti. Castor e' stato gia' visto prima. Per Tomcat potete vedere qui. Ecco invece l'installazione di Axis. Tomcat non e' altro che un server Web ottimizzato per eseguire programmi Java lato server (servlet) per cui ci si riferisce ad esso indicandolo come un contenitore di servlet. Axis e' un toolkit per sviluppare servizi Web che oltre ad avere una serie di programmi di utilita' come wdsl2java , lavora anche come un servlet di Tomcat che sa come trattare i protocolli SOAP, Xml Schema e WDSL. Invece Castor (un programma autonomo) ci servira' in alcuni servizi web per trasformare i dati di un documento xml in un'insieme di classi Java e viceversa(data binding).Questa operazione dovrebbe in teoria essere fatta da Axis con wsdl2java che genera stubs per il cliente e il server+classi per modellare i dati nell'xml(data binding). Perche' non e' sufficiente wsdl2java e dobbiamo usare anche Castor? Perche' l'operazione di data binding e' delicata e richiede un software maturo e specializzato come Castor.

Costruzione di un client SOAP

La costruzione di un cliente SOAP non e' difficile e si puo' fare praticamente in ogni linguaggio.Qui vedremo qualche esempio costruito in Java, Javascript e PHP.
La maniera piu' semplice e' quella di preparare a mano la richiesta in un file di testo.In questo caso e' una richiesta al servizio di Google.Quindi usiamo un programma Java per inviare la richiesta al servizio usando http POST .Lo stesso programma scarica il risultato della richiesta in quest'altro file. Per poter interrogare Google si scrive il comando:
java gsearch http://api.google.com/search/beta2 googleinput.xml googleoutput.xml
Per capire come si costruisce "a mano" la richiesta SOAP da inviare al servizio, bisogna conoscere la descrizione dello stesso in formato wsdl.Meglio ancora ci facciamo decodificare la descrizione wsdl da questo wsdl analyzer.Qui troviamo l'informazione che e' disponibile il metodo doGoogleSearch per il quale dobbiamo usare il namespace urn:GoogleSearch.

Il nodo di root di un messaggio SOAP e' un elemento Envelope che ha come unico elemento figlio Body(vedi figura sopra).E' proprio all'interno di questo elemento che inseriremo la chiamata alla procedura remota che diventa il nome del comando xml. Gli argomenti della chiamata alla procedura remota, sono i figli di questo elemento.Un messaggio SOAP puo' anche contenere un elemento Header prima di Body e un elemento Fault interno a body. Il comando Fault permette di trattare gli errori. Un messaggio SOAP puo contenere anche attachment binari, esattamente come avviene con un mail.
Ed ecco la richiesta e la risposta per il servizio Web di Somma.

Vediamo come si legge il file WSDL usando il servizio Somma che ritorna la somma di 2 interi.All'interno dell'elemento radice definitions abbiamo nell'ordine gli elementi message, portType, binding,service. Il fatto che inviamo 2 interi e riceviamo l'intero somma e' descritto dai 2 comandi message: notate i nomi in0,in1,sommaReturn assegnati ai 3 numeri e il tipo indicato come xsd:int utilizzando XMLSchema.
La descrizione e' completata da portType dove si indica esplicitamente che c'e' un unico metodo somma descritto dall'elemento operation che prevede in0,in1 in input e il messaggio sommaResponse come output.
binding contiene l'informazione che il nostro documento e' di tipo rpc e viaggia su http.
Un file WSDL contiene di solito anche l'elemento types che descrive il tipo di dati da inviare usando Xml-schema.

Ecco client SOAP per il servizio Web di Google scritto in PHP. Ora la richiesta e' fatta direttamente da PHP : voi dovete fornire solo l'URL del servizio,la lista dei parametri e l'url del namespace di Google. Tutte le operazioni di mandare la richiesta e recuperare i dati dalla risposta sono rese possibili dal pacchetto nusoap.php scaricato da Internet.
Il client SOAP per il servizio Web di Somma scritto in PHP.
Ancora un altro client sempre in PHP per questo servizio.

Ancora un client SOAP ma questa volta in Javascript sempre per Google. Questo client per questioni di protezione , funziona solo in locale.Cioe' dovete scaricare i due file sul vostro disco e aprire il primo dei due col browser (dopo aver inserito la vostra chiave di Google).In questo client la richiesta e' fatta "a mano" inserendola direttamente nel codice Javascript. Invece la stampa del risultato e' fatta da funzioni Javascript che fanno il parsing del documento ricevuto e lo rappresentano nella pagina Web.

Costruzione di un server SOAP

Fornire un servizio Web con SOAP consiste essenzialmente nello scrivere un server Web che capisca e sappia estrarre la richiesta dal documento inviato dal cliente.La risposta deve essere anch'essa codificata usando SOAP.
Ecco un esempio di server scritto come applicazione Java che usa il seguente file di configurazione anch'esso in xml.Questo server usa JDBC per trattare i dati da memorizzare o leggere da un data base mysql.
Per lavorare con un simile server uno puo' scrivere un client come quelli visti prima ad esempio in Javascript o in PHP.

Realizzazione di un servizio completo di WDSL

Adesso e' meglio usare un toolkit che faciliti il processo di creare il codice clent/server nonche' la descrizione in wsdl del servizio.Per questo useremo Axis con Tomcat (+Castor). In Axis come in altri toolkit si puo' procedere in 2 modi:
  1. Definiamo l'interfaccia Web come metodi Java e facciamo creare tutto il resto ad Axis.
  2. Definiamo il servizio con un file wsdl e facciamo creare il resto ad Axis
Cominciamo a creare un servizio Web a partire dalla descrizione in formato wsdl. Il servizio e' di tipo document. Il comando dato in AXIS_HOME:
java org.apache.axis.wsdl.WSDL2Java -o persone -s "persone.wsdl"
crea una serie di files nelle sottocartelle persone_wsdl e persone_xsd di persone/ba/persone . Dobbiamo modificare il file PersoneSoapBindingIm pl.java in modo da ritornare invece di null l'oggetto ListaResponse. Compiliamo il tutto con:
javac persone/ba/persone/*/*.java
Copiamo il file di deploy con:
cp persone/ba/persone/persone_wsdl/deploy.wsdd .
Copiamo tutti i files generati in webapps con:
 mv persone/ba/persone $CATALINA_HOME/webapps/axis/WEB-INF/classes/ba/persone

Procediamo ora al deployment con:
java org.apache.axis.client.AdminClient deploy.wsdd
Un nuovo servizio persone e' ora disponibile col metodo getLista che ritorna una lista di persone.

Ora invece realizziamo un servizio sempre tipo "document" che alla richiesta "getTracker=fulltracker" deve ritornare un documento che segue il seguente schema.

Soluzione 2 : l'approccio REST

La soluzione REST (REpresentional State Transfer) puo' essere sintetizzata come "xml su http". Questo perche' non richiede nuovi linguaggi e standard ma riusa in maniera "furba" gli standard preesistenti : http, uri, etc Per questo si parla di approccio REST ai servizi Web. Esso non si basa sul paradigma preso dalla programmazione ad oggetti della chiamata di metodi remoti ma sul paradigma del Web. Invece di dare la liberta' di definire "oggetti" e "metodi" qualsiasi, si considera un oggetto di un solo tipo: la risorsa. Ogni risorsa (come succede per il documento Web) viene identificata da un'unico indirizzo (il normale URL o URI).Per gestire la risorsa si usa http e le sue quattro direttive GET (per leggere), DELETE (per cancellare), PUT (per aggiornare) e POST (per creare).

Nel nostro caso le risorse da indicare con URI univoche sono:

A questo livello non viene detto niente su chi , come e dove sara' gestita la rubrica. Potrebbe essere gestita da uno ,due o anche piu' server, con l'uso di mysql oppure semplici files di testo , etc L'importante e' che l'accesso avvenga sempre attraverso l'indirizzo indicato producendo l'effetto richiesto.(La stessa cosa avviene adesso coi normali documenti: dietro ci potrebbe essere un file oppure il documento potrebbe essere creato a volo ).Nell'approccio REST il client puo' essere,se ci si limita ai comandi GET e POST, il normale browser.

Documenti xml, linguaggi ad oggetti e database

Finora abbiamo parlato di xml come una maniera standard di rappresentare informazione strutturata.Dal punto di vista dell'utente internet questa descrizione e' adeguata. Ma ora consideriamo la stessa cosa vista da un programmatore di computer. Non c'e' dubbio che la "rivoluzione" xml riguardi anche i programmatori ma a che livello? Per esempio ecco alcune domande che si potrebbe porre un programmatore: Abbiamo gia' visto che i servizi web realizzati con SOAP(Simple Object Access Protocol) si basano su un paradigma di programmazione ad oggetti. La richiesta di servizio e' il richiamo di un metodo e il risultato e' uno o piu' oggetti mandati al richiedente racchiusi in un documento xml.Lo stesso DOM (Document Object Model) descrive un documento xml come una gerarchia di oggetti. Si tratta in effetti di un vero e proprio contenitore di oggetti che puo essere usato per rappresentare tutti i maggiori tipi di contenitori usati nei moderni linguaggi di programmazione ad oggetti.

Questo fatto implica due cose di grande importanza per il programmatore:

  1. E' possibile progettare un'applicazione ad oggetti descrivendo i dati direttamente in xml.
  2. Possiamo pensare all'xml come una maniera "light" di serializzare i nostri oggetti assicurandone la persistenza.
Insomma l'xml diventa una rappresentazione degli oggetti sia su una memoria di massa che nelle specifiche di disegno dell'applicazione. L'idea base e' di usare la descrizione dell'xml fatta ad esempio in XML-Schema ,per generare direttamente le definizioni degli oggetti e il codice per trattarli inclusa la possibilita' di salvare gli stessi oggetti in xml.

Visto da questo punto di vista il problema di estrarre le informazioni da un documento xml (visto nei paragrafi precedenti) viene risolto in maniera elegante , creando in maniera automatica in memoria gli oggetti corrispondenti al documento xml. Ci sono varie tecnologie che sfruttano questo: ad esempio la tecnologia JAXB(Java Architecture for XML Binding) e Castor visto nel capitolo precedente. Un programma che utilizza questa tecnologia all'inizio fa l'operazione di unmarshalling di un file xml caricandolo in un contenitore di oggetti. Ora il contenuto puo' essere modificato a piacimento finche' non si procede nell'operazione inversa di marshalling per salvare il contenuto modificato su un altro file xml.

Altre tecnologie come JDO(Java Data Object) vanno ancora piu' in la ed oltre ad assicurare il collegamento tra oggetti e xml , danno la possibilita' di realizzare anche una persistenza "hard" con del codice che permette di salvare gli oggetti in maniera automatica anche su un normale database tipo mysql.

In generale, considerando la relazione tra xml e database, bisogna tener conto di questo fatto: un insieme di documenti xml assieme ai tool considerati costituiscono un vero e proprio data base management system anche se rudimentale. Infatti abbiamo i dati memorizzati nei file xml, lo schema descritto da xml-schema, la possibilita' di fare query con XPath e XQuery , librerie per l'accesso ai dati e tool come il parser Xerces, Xalan per fare trasformazioni , Galax per processare queries . A questo punto e' comprensibile che da una parte abbiamo la possibilita' di avere dei database "tradizionali" (relazionali o xml) per il backup e la gestione unificata di un insieme di documenti; dall'altra vediamo gli standard e i tool evolversi in modo da permettere di fare con xml cose che si fanno coi database tradizionali. Ad esempio avere linguaggi di query compatibili con SQL.
Ecco un esempio di un insieme di circa 20 documenti xml che formano un database che descrive il detector CMS. I files si trovano a partire dalle seguenti cartelle:Tracker,Muon,etc La descrizione del contenuto in html. Se guardate il sito che descrive questo database, vedrete che finora il database e' stato gestito usando direttamente questi files, ma in futuro si usera' un database relazionale come sostegno .Il software usato per la gestione attuale e' Xerces + Xalan in C++. In definitiva, possiamo pensare all'XML come una "vista" dei nostri dati , un livello logico di descrizione sovrapposto a quello fisico. Questo allo scopo di rendere i nostri dati indipendenti dal modo come sono memorizzati. La memorizzazione di dati xml puo' avvenire direttamente come file xml (nel qual caso l'XML funziona come serializzazione light dei nostri oggetti) oppure in data base relazionali o xml. Usando come riferimento i database relazionali con SQL , possiamo fare il seguente schema a quattro livelli.
SQLXSLT, XQuery, XPath
JDBC Api DOM , Api SAX
modello di dati relazionale modello di dati di XPath
memorizzazione fisica delle tabelle memorizzazione fisica dei documenti xml

Un'altra importante influenza di queste nuove tecniche sul lavoro del programmatore e' la seguente: lo sviluppo di servizi Web comincia a fare concorrenza alle applicazioni desktop. Per cui,dovendo sviluppare una nuova applicazione, conviene chiederci se non e' il caso di svilupparla come web service, evitando tutti i problemi legati alla portabilita' e all'adeguamento ai sistemi operativi che cambiano in continuazione. E' vero che adesso i servizi Web (rispetto alle applicazioni) sono lenti ed hanno interfacce scadenti, ma ci stiamo abituando a poco a poco (ad esempio lettura posta) e secondo me rimpiazzeranno a poco a poco le applicazioni desktop. Anche perche' fra poco usufruiremo di Internet direttamente da cellulari e palmari che potrebbero non avere la stessa potenza del desktop.Un indice significativo che stiamo andando in questa direzione e' l'implementazione sempre piu' frequente del protocollo Webdav che permette di scrivere in un sito Web remoto. Questo e' disponibile in IIS e anche in Tomcat. E inoltre i progetti di scrittura via Web di documenti come blog e wiki.

AJAX, Web 2.0 e Servizi Web

Nel 2005, dopo che questo seminario era stato dato per la prima volta, e' scoppiata la "rivoluzione" AJAX (Asynchronous Javascript and XML). Siti come Google Maps e flickr hanno propagandato l'uso di questa nuova tecnica. Questa non e' strettamente correlata con l'argomento principale di questo seminario: la realizzazione di servizi Web. Ma se considerate nella sua interezza la realizzazione di un'applicazione Web , allora possiamo dire che i servizi web ridefiniscono tutta la parte "server" dell'applicazione, mentre AJAX ridefinisce la parte client. Infatti AJAX serve a realizzare interfacce piu' soddisfacenti per l'utente eliminando la necessita' del Web 1 di cliccare su qualcosa ed attendere l'arrivo di una nuova pagina ogni volta che si richiede una nuova informazione. Ora col Web 2 ogni richiesta dell'utente viene soddisfatta aggiornando la pagina iniziale. L'idea centrale e' di far diventare l'esperienza utente di un'applicazione Web uguale a quella di un'applicazione desktop.

I dettagli tecnici di realizzazione possono essere visti in questo programma AJAX dimostrativo:orologio digitale. Esso usa l'oggetto XMLHttpRequest per collegarsi a un server che fornisce l'ora sotto forma di file xml.Insomma il trucco e' che le richieste di aggiornamento sono fatte dietro le quinte da un programma Javascript. Una volta ricevuto il file XML si procede ad aggiornare la pagina usando alcune funzioni Javascript. Il metodo piu' semplice e' quello di dare un nome alle parti del documento da modificare racchiudendole tra <div id="nome"> e </div> e poi usare

 document.getElementById("nome").innerHTML=req.responseXML.getElementsByTagName("nome_tag_contenente_informazione_aggiornata"); 
Nonostante non ci sia relazione tra tecniche AJAX e servizi Web, proprio i siti Web che forniscono un'interfaccia AJAX come i due visti prima , hanno sviluppato delle Web API fornendo servizi Web e permettendo in tal modo agli utenti di personalizzare l'interfaccia o addirittura di costruire dei nuovi servizi basati su quelli di base . Ad esempio l'Api Google Maps viene usato per creare e rendere disponibili centinaia di applicazioni basate su mappe. Insomma questi siti AJAX fornendo dei web services accessibili a tutti stanno dimostrando le possibilita' offerte dall'approccio basato su servizi.

Non abbiamo parlato di ...

L'argomento xml e' vastissimo e abbiamo dovuto lasciare da parte alcuni importanti argomenti per rendere le cose piu' comprensibili:

Conclusione

Quando ormai ci eravamo abituati a gestire siti con migliaia di pagine col nostro bravo database relazionale interfacciato al Web, eccoci arrivati a una nuova mutazione in cui i siti definendo una rappresentazione comune, ormai non sono piu' delle isole, ma comunicano tra di loro scambiandosi informazioni. Questo produrra' applicazioni finora mai viste e che solo adesso cominciamo a vedere: Una ricerca su Google di file xml (basta usare "filetype:xml" nella ricerca) mostra 1.500.000 pagine circa.Questo da un'idea del successo di queste nuove tecnologie anche se siamo lontani dal sogno di realizzare un'informazione online completamente classificabile. Il Web semantico.
Ultimo aggiornamento :