JAXB: XML binding in Java

In questo primo articolo usiamo JAXB per leggere file XML.

Da Java abbiamo diversi modi per poter accedere a file XML. Esistono infatti diverse API riguardanti parser SAX e DOM che ci permettono di leggere un file XML e parsarlo in maniera differente ottenendo il contenuto del file. Esiste anche un altro approccio al parsing ed è quello di JAXB (Java Api for XML Binding).

Grazie a queste API possiamo creare dei veri e propri oggetti Java a partire dalla definizione del file XML, definizione che viene di solito fatta usando DTD o XML Schema. A partire da queste definizioni vengono create dinamicamente delle classi Java che poi conterranno i dati riportati nel file XML.

JAXB

JAXB

Come potete vedere dall’immagine qui riportata il funzionamento è abbastanza semplice, vengono creati degli oggetti a partire dalla definizione del file XML. Vediamo ora come usare JAXB. Partiamo prima di tutto da un file XSD (XML Schema). Dobbiamo generare le classi che serviranno a contenere i dati del file XML e per fare ciò dobbiamo utilizzare uno script che viene distribuito insieme a JAXB

xjc.sh -p javastaff.jaxb libro.xsd -d cartellaOutput

L’opzione -p identifica il package di cui faranno parte le classi che vengono generate e -d specifica la directory di output. Chiaramente deve essere passato come argomento lo schema che il file XML rispetterà. L’XSD che abbiamo utilizzato è rappresentato nella seguente figura

Struttura XSD

Struttura XSD

Avremo ora a nostra disposizione tutta una serie di classi generate da questo tool. Quando richiameremo il file XML per usare le informazioni in un programma Java dovremmo sapere gli attributi da richiamare. Questo lo sappiamo o conoscendo lo schema del file XML o semplicemente navigando tra i sorgenti delle classi che sono state generate.

Ecco quindi il codice che utilizzeremo per richiamare il file XML e stampare a schermo gli attributi relativi all’XML che abbiamo utilizzato in questo esempio

JAXBContext jc = JAXBContext.newInstance("javastaff.jaxb");
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setValidating(true);
Collection collection= (Collection)
	unmarshaller.unmarshal(new File( "libreria.xml"));
CollectionType.LibroType libroType = 
collection.getLibros();
List libriList = libroType.getLibro();

Utilizzando JAXB leggiamo un file XML dove sono mappati una serie di libri, che rispettano l’XSD che abbiamo definito. In questo modo JAXB effettua il mapping delle informazioni con le classi che abbiamo generato precedentemente e ci permette di navigare tranquillamente i dati senza doverci preoccupare del parsing.

Il file XSD potrebbe essere più complesso e avere collezioni di oggetti dentro altre, ovvero oggetti complessi come attributi di oggetti quindi il procedimento sarebbe quello di richiamare non il semplice metodo getAttributo e stampare a schermo ma fare il cast alla classe che viene usata per mappare quella tipologia di dato e poi effettuare le operazioni su quest’ultima. Comunque sia niente di troppo difficile una volta che abbiamo provato un paio di volte ad usare questo metodo.

Sicuramente sia per le prestazioni che per i possibili errori troveremo questa soluzione migliore del parsing del documento che tante volte può risultare difficile.

Ecco alcuni link

http://java.sun.com/xml/jaxb/index.jsp
http://java.sun.com/webservices/webservicespack.html
http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-jaxb.html

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.