Ottimizzazione XML open source: EXIficient

30 dicembre 2013

Nell’articolo L’ottimizzazione dei documenti XML in Java sono state descritte le esigenze che hanno portato alla richiesta di ottimizzare i documenti XML (eXtensible Markup Language), introducendo i principali approcci alla risoluzione del problema. Il W3C (World Wide Web Consortium) ha emesso le specifiche per il formato binario di scambio EXI (Efficient XML Interchange), rappresentazione molto compatta delle informazioni XML. Questo formato è arrivato alla versione 1.0 ed entrato a far parte delle raccomandazioni W3C nel marzo del 2011.

La specifica ha dato origine a diverse implementazioni, in questo articolo esamineremo EXIficient, progetto open source avviato dalla Siemens AG e scritto nel linguaggio di programmazione Java. Muoveremo i primi passi nell’utilizzo del framework, vedremo cosa è incluso nella distribuzione del prodotto e come realizzare una classe Java che utilizzi la libreria EXIficient.

Utilizzeremo del codice di esempio per l’utilizzo delframework, per provarlo bisogna avere correttamente installato il JDK in versione 1.5 o successiva (requisito minimo per EXIficient). Nell’archivio allegato all’articolo è possibile trovare le classi che verranno successivamente descritte e un documento XML d’esempio corredato dal relativo XSD.

EXIficient: primi passi

EXIficient è un’implementazione della specifica EXI. Obiettivo finale è da un lato migliorare le performance degli strumenti che già utilizzano l’XML per scambiare dati, dall’altro permettere di incrementare il numero di domini e applicazioni per i quali l’XML rappresenti una scelta valida; tra gli obiettivi degli sviluppatori di EXIficient vi è inoltre l’intenzione di rendere la tecnologia disponibile alla comunità web.

Il progetto è arrivato alla versione 0.9.2. Il sito di riferimento mette a disposizione le informazioni essenziali; nella sezione download è possibile trovare il link del progetto su SourceForge, inoltre, sono disponibili le informazioni utili ad includere il progetto come dipendenza al POM maven, o per effettuare il checkout da un repository SVN. Potete continuare a leggere l’articolo anche senza avere familiarità con questi termini, basterà sapere che si tratta di strumenti a supporto del ciclo di vita del software, non indispensabili per utilizzare EXIficient. Sempre sul sito ufficiale, sezione “External Tools”, è possibile trovare una lista di tools basati su EXIficient o che ne usano la libreria; tra questi tools vi è ExiProcessor, programma (in fase di sviluppo) utilizzabile da linea di comando che codifica e decodifica file XML verso e da files binari EXI, in pratica un’interfaccia testuale per il framework.

L’archivio bundle

Sempre tramite SourceForge è possibile scaricare l’archivio “exificient-[vers]-bundle”. Al suo interno si potranno trovare le cartelle con sorgenti e binari, una cartella “lib” contenente la libreria exificient.jar e le altre librerie richieste come dipendenze (xercesImpl.jar e xml-apis.jar), una cartella “doc” con la documentazione e una cartella “sample-data” con un documento XML e il relativo schema XSD utili a effettuare le prime prove.

Sono inoltre disponibili due script, uno per Windows (run-sample.bat) e uno per Linux (run-sample.sh) che permettono di cominciare a usare l’archivio estratto come strumento di ottimizzazione.

E’ possibile importare nell’IDE Eclipse, o in altri IDE come NetBeans, la cartella “bundle” come progetto esistente per lavorarci direttamente. In questa sezione ci limiteremo ad usare gli script.

EXIficient: utilizzo tramite script

Abbiamo visto che nell’archivio sono già disponibili gli script da lanciare, essi sono configurati per ottimizzare il file notebook.xml presente nella cartella “sample-data”. Esplorando uno degli script, vedremo che per lanciare la classe EXIficientDemo vengono passati tre parametri, ossia il file da ottimizzare, lo schema XML associato e il numero di esecuzioni dell’ottimizzazione (di default una sola)

Lanciando lo script, otterremo il seguente output:

Esecuzione dello script run-sample

ALT_TEXT

Verra quindi creata una nuova cartella, “sample-out”, dove verranno posizionati i file ottimizzati e i file decodificati ottenuti a partire dai file codificati. E’ possibile notare che inizialmente è stata effettuata una ottimizzazione senza l’utilizzo delle informazioni dello schema (SchemaLess) che ha prodotto un file (notebook.xml_exi) del peso di poco più di un terzo dell’originale, documento che è stato successivamente decodificato (notebook.xml_exi.xml) per riottenere l’XML di partenza.

In seguito si è ripetuta l’operazione aggiungendo il contributo dello schema XSD (SchemaInformed) ottenendo un file (notebook.xml_exi_schema) circa cinque volte meno ingombrante dell’originale. Come in precedenza, il file ottenuto è stato a sua volta decodificato per ottenere l’XML di partenza (notebook.xml_exi_schema.xml). Al variare del terzo parametro non sono registrate delle variazioni, è possibile mantenerlo al valore di default.

Proviamo a comprimere un altro documento XML. A tal scopo è possibile aggiungere alla cartella “sample-in” il documento XML con relativo schema inclusi nell’archivio allegato all’articolo (SampleGeospatialReference.xml e SampleGeospatialReference.xsd), per poi modificare lo script in modo che venga ottimizzato quest’ultimo documento.

Esaminando l’XML in questione, potremo vedere che si tratta di un esempio basato su classici dati di geolocalizzazione in cui vengono ripetute lunghe sequenze di elementi dello stesso tipo, in questo caso punti identificati da latitudine e longitudine. Modifichiamo ed eseguiamo lo script per caricare i nuovi documenti (di seguito si modifica lo script “.bat”, nello stesso modo è possibile modificare per linux lo script “.sh”):

java -cp .;bin;lib/exificient.jar;lib/xercesImpl.jar;lib/xml-apis.jar EXIficientDemo sample-data-ext/SampleGeospatialReference.xml sample-data-ext/SampleGeospatialReference.xsd

In questo caso, come era da attendersi, per dati di geolocalizzazione i risultati sono anche migliori, arrivando ad ottenere un file ingombrante meno di un sesto dell’originale nella modalità SchemaLess, e circa un decimo dell’originale nella modalità SchemaInformed. I risultati offerti dal framework sono dunque in linea con quanto riportato sulle specifiche del formato EXI.

Finora abbiamo utilizzato lo script e la classe demo d’esempio, cosa succede però nel momento in cui vogliamo provare a ottimizzare un documento senza avere il corrispondente schema? Provando a passare solo il primo argomento (nome e posizione dell’XML) verremo informati… che non è stato fornito lo schema e il programma si arresterà sollevando un’eccezione (Input files not valid!). Questo succede perché la classe cui fa riferimento lo script richiede come ingressi sia l’XML che lo schema relativo.

Nella prossima sezione vedremo come utilizzare EXIficient in maniera programmatica, lavorando anche in assenza dello schema e arrivando alla creazione di una classe che potrà affiancare (o sostituire) la classe d’esempio messa a disposizione dagli sviluppatori del framework.

Se vuoi aggiornamenti su Ottimizzazione XML open source: EXIficient inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Ottimizzazione XML open source: EXIficient

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy