[Tutorial] Leggere - Creare – Manipolare file xml Attraverso Java e la libreiria JDom

XML (eXtended Markup Language) è lo standard più utilizzato ed universalmente riconosciuto per la scrittura dei dati.

Per Java sono state sviluppare numerose librerie in grado di interagire con i file XML, ma un posto di particolare rilievo merita JDOM, essendo di semplice utilizzo, ma al tempo stesso molto potente e completa.

Utilizzando JDOM sarete in grado di:

  • Scorrere un file XML, dalla radice alle foglie

  • Scrivere un file XML, definendone la struttura dell’albero senza vincoli di alcun tipo.

La libreria, nella sua versione 2.0.2, può essere scaricata al seguente link

Tutta la documentazione ed altre versione è possibile reperirla sul sito ufficiale

Leggere un file XML

Per cominciare bisogna creare un oggetto SAXBuilder:

SAXBuilder builder = new SAXBuilder(); 

Questo oggetto ci fornirà il metodo build che si occupa di effettuare il parsing del file XML passatogli in argomento, restituendolo in un oggetto Document

 Document doc = builder build(new File(name.xml)); 

Per poter riuscire a scorrere la struttura creata nell’oggetto doc è necessario ottenere la root del documento(Ogni file XML dovrebbe avere un unica root):

  Element rootElement = document.getRootElement(); 

La classe Element, che possiamo definire il cuore di JDom, ci fornisce funzionalità molto interessanti come:

  • Ottenere tutti gli elementi figli di un elemento:

    
    List children = rootElement.getChildren();
    Iterator iterator = children.iterator();
    while (iterator.hasNext()){
           Element element = (Element)iterator.next();
    	/...
    }
    

  • Ottenere un elemento figlio di un elemento:

    Element child =rootElement.getChild(“namechild”);

  • Ottenere tutti gli attributi di un elemento, vi ricordo che gli attributi sono composti da due campi(name e value):

     List attributes = rootElement.getAttributes();
    Iterator iterator = children.iterator();
    while(iterator.hasNext()){
    	Attribute attribute = (Attribute)iterator.next();
    	String name = attribute.getName();
    	String value = attribute.getValue();
    	//... 
    }
    

  • Ottenere un attributo di un elemento e/o il suo valore:

     Attribute attribute = rootElement.getAttribute(“name”);
    String value = rootElement.getAttributeValue(“name”);
    int value =attribute.getIntValue();
    //...
    }
    

  • Ottenere il testo compreso fra i tag di apertura e chiusura dell’elemento:

    	String text = rootElement.getText();

Scrivere un file XML

Per poter scrivere un file XML gli oggetti da utilizzare sono più o meno
gli stessi. Occorre pertanto creare un oggetto Document e assegnargli
un elemento in fase di costruzione:


Element rootElement = new Element("ROOT");
Document document = new Document(rootElement);

Possiamo quindi assegnare all’elemento radice, attributi e figli


Element child1 = new Element("CHILD1");
rootElement.addContent(child1); 
Element child2 = new Element("CHILD2");
child2.setText("TextChild2");
child1.addContent(child2);
rootElement.setAttribute("AName","AVal");

La struttura create nell’oggetto document sarà la seguente:

 
<ROOT AName="AVal">
     <CHILD1> 
	 <CHILD2>Textchild2</CHILD2>
     </CHILD1>
</ROOT>	
	

Per scrivere la struttura creata, abbiamo bisogno dalla classe XMLOutputter, che si preoccupa di eseguire l’output della struttura XML creata:

 
XMLOutputter outputter = new XMLOutputter();
outputter.output(document, new FileOutputStream("name.xml"));

Il metodo output prende in argomento l’oggetto Document e un oggetto OutputStream su cui scrivere il document. Ovviamete il file se non esiste, esso viene creato.

Per poter manipolare il file basta unire le nozioni appena imparate per la lettura con quelle della scrittura.

Fare il parsing dell' XML

 
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(“name”);

Ottenere la root del documento

 Element root = doc.getRootElement();

Creare nuovi figli, e nuovi attributi

 
Element newChild = new Element("NewChild").setText("NewText");
Attrbute newAtt = new Attribute(“name”,”value”);

Aggiungere gli attributi al nuovo figlio

 newChild.setAttribute(newAtt);

Aggiungere il nuovo figlio alla root

  root.addContent(newChild);

Scrivere la struttura manipolata

 
XMLOutputter outputter = new XMLOutputter();
outputter.output(document, new FileOutputStream("name.xml"));