Leggere un file XML in Java con la libreria JDOM

Leggere un file XML in Java con la libreria JDOM

In questo post vedremo come poter leggere e scrivere un file XML in Java utilizzando la libreria JDOM. JDOM è una API Open Source, sviluppata da Brett McLaughlin e Jason Hunter, la quale interagisce con gli standard già esistenti quali SAX (Simple Api for XML) e DOM (Document Object Model), il cui obiettivo non è quello di creare uno strato di astrazione aggiuntivo o di potenziamento delle funzionalità di queste API, ma bensì quello di fornire un modello e degli strumenti che siano più familiari ad un programmatore Java, rendendo meno complessa e meno esigente di risorse la manipolazione di file XML. La versione che prendiamo in esame in questo articolo è la 1.1.1 (la più recente nel momento in cui scriviamo) nella quale è stato aggiunto il supporto alla Virtual Machine Dalvik (la VM di Android).

Tutorial Apache POI: scriviamo e leggiamo un documento Word
Creare e modificare bytecode Java a runtime con la libreria Javassist
Sviluppare un’applicazione web Ajax con Java ed Ext JS

In questo post vedremo come poter leggere e scrivere un file XML in Java utilizzando la libreria JDOM. JDOM è una API Open Source, sviluppata da Brett McLaughlin e Jason Hunter, la quale interagisce con gli standard già esistenti quali SAX (Simple Api for XML) e DOM (Document Object Model), il cui obiettivo non è quello di creare uno strato di astrazione aggiuntivo o di potenziamento delle funzionalità di queste API, ma bensì quello di fornire un modello e degli strumenti che siano più familiari ad un programmatore Java, rendendo meno complessa e meno esigente di risorse la manipolazione di file XML.

La versione che prendiamo in esame in questo articolo è la 1.1.1 (la più recente nel momento in cui scriviamo) nella quale è stato aggiunto il supporto alla Virtual Machine Dalvik (la VM di Android).

Per scaricarla possiamo farlo da questa URL:

http://www.jdom.org/dist/binary/

Iniziamo a vedere le classi basilari di questa libreria: l’istanza della classe org.jdom.Document è quella che rappresenterà il nostro documento XML una volta che sarà parserizzato. La prima cosa da notare è che tale classe non ha niente a che vedere con l’analogo Document del modello DOM (che in Java è implementato nelle API JAXP consultabili a questo indirizzo: http://download.oracle.com/javase/6/docs/technotes/guides/xml/index.html), nè tanto meno le altre classi di JDOM che hanno un nome analogo (tra cui la classe Element o Attribute). Esse sono solo delle classi con le quali possiamo rappresentare una particolare “caratteristica” del nostro file XML, come ad esempio un Nodo, un Attributo, ecc…

Ritorniamo ora al nostro Document, il quale per essere istanziato ed associato ad un file XML ha bisogno dell’ausilio di un parser XML. Per istanziare ed utilizzare un Parser utilizziamo le classi Builder che possonoessere di due tipi:

  • SAXBuilder;
  • DOMBuilder.

come è facile intuire dai  nomi, il SaxBuilder caricherà ed effettuera il parsing di un documento XML utilizzando le API SAX, mentre il DOMBuilder utilizzerà il modello DOM. Entrambi i Builder utilizzano come default il Parser implementato in JAXP, il quale è incluso nella distribuzione Java e di conseguenza non dobbiamo aggiungere altre librerie al nostro progetto.

Il SAXBuilder accetta diversi tipi di formati in input, tramite il metodo overloaded build(), quali ad esempio un InputStream, un InputSource, un File, un URL o semplicemente una Stringa contenente il path del file XML, il DOMBuilder deve invece ricevere in input una istanza del documento XML già parserizzata secondo il modello DOM (un’istanza di org.w3c.dom.Document). Con il seguente codice istanziamo la classe Document a partire da un file XML parserizzato tramite SAX:

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("rubrica.xml");

E’ possibile validare il documento XML passando come parametro il valore true al costruttore del SAXBuilder (new SAXBuilder(true)). Se volessimo invece utilizzare un altro Parser quale ad esempio Xerces, allora dobbiamo specificare il nome della classe parser da utilizzare che nel caso di Xerces è org.apache.xerces.parsers.SAXParser e passarla al costruttore del SAXBuilder:


SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");

ovviamente dobbiamo includere la libreria xercesImpl.jar (scaricabile dall’indirizzo http://xerces.apache.org/xerces-j/) nel Build Path del progetto.

Ottenuto il Document possiamo navigare all’interno di esso in maniera molto facile utilizzando i metodi forniti dalle API JDOM: ad esempio possiamo ottenere l’elemento (nodo) radice con il seguente metodo:

Element root = doc.getRootElement();

e su questo elemento andare a visionare i figli (del primo livello) con il metodo:

List children = root.getChildren();

inoltre possiamo navigare su tutti i discendenti di un nodo utilizzando il seguente metodo:


Iterator itr = doc.getDescendants();
while (itr.hasNext()) {
Content c = (Content) itr.next();
System.out.println(c);
}

il metodo getDescendant() ritorna un iteratore il quale ci permette di scorrere tutti i discendenti in ordine. A tale metodo possiamo passare un Filter (ElementFilter) con il quale selezionare solo particolari tipi di Elementi, ad esempio con il seguente codice:


itr = doc.getDescendants(new ElementFilter());
while (itr.hasNext()) {
Content c = (Content) itr.next();
System.out.println(c);
}

Non specificando alcun valore per ElementFilter verranno selezionati solo i discendenti di tipo Element, se avessimo usato new ElementFilter(“contatto”), allora avremmo selezionato solo i discendenti con come elemento uguale a contatto (cioè con tag <contatto>).

I tipi di nodi che JDOM riconosce e mappa su di una sua classe sono i seguenti:

Le classi Core della libreria JDOM

PAGES

1 2

COMMENTS

WORDPRESS: 1
  • comment-avatar
    GoGoMoNkEy 11 anni ago

    Ti ringrazio per questo articolo! Mi è stato molto utile! 😀