venerdì 8 giugno 2012

Usare JAXB con StAX+XPath per prestazioni e comodità d'uso (1)

Una delle tecnologie Oracle per l'elaborazione di documenti XML è Java Architecture for XML Binding (JAXB).

Questo framework permette di effettuare il collegamento tra Java e XML; in particolare JAXB fornisce la possibilità di serializzare oggetti Java in XML (marshalling) e di effettuare l'operazione inversa (unmarshalling).

Immagine dal sito Oracle
Il collegamento Java-XML può essere effettuato a partire dallo Schema Xml che rappresenta il modello di documento da elaborare. Il compilatore JAXB produce le classi Java da utilizzare nell'applicazione per effettuare il marshalling e l'unmarshalling dei documenti istanza.

Supponiamo di avere il seguente documento e il relativo Schema Xml.

<root xmlns="http://ict-tic.blogspot.com">
  <elements
   <mrSneerObj><!--other xml content--></mrSneerObj>
   <mrSneerObj><!--other xml content--></mrSneerObj>
   <mrSneerObj><!--other xml content--></mrSneerObj>
   <mrSneerObj><!--other xml content--></mrSneerObj>
   <mrSneerObj><!--other xml content--></mrSneerObj>
   <mrSneerObj><!--other xml content--></mrSneerObj>  
  </elements>  
</root>

L'approccio classico di JAXB prevede, dopo la generazione delle classi a partire dallo Schema, la creazione di un contesto JAXB relativo al package prodotto dal compilatore JAXB e del relativo Unmarshaller.

L'Unmarshaller può quindi essere usato per produrre gli oggetti Java che rappresentano il documento XML. L'invocazione del metodo unmarshal accetta diverse rappresentazioni del documento XML di input. Di seguito è mostrata l'invocazione usando un reader StAX come parametro.

JAXBContext jc = JAXBContext.newInstance("it.mrsneer");
final Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Root> obj = (JAXBElement<Root>) u.unmarshal(streamReader, Root.class);

L'oggetto restituito corrisponde al tag <root> e può essere navigato tramite i metodi getter come un normale POJO. Ovviamente in memoria, nella JVM, ci sarà un albero di oggetti Java collegati tra loro in modo da rappresentare tutti i nodi del documento XML di partenza.

Nessun commento:

Posta un commento