Le tecnologie XML si sono affermate in molti ambiti, dallo scambio dati tra diverse piattaforme, grazie anche ad HTTP e WebService, alla messagistica. Anche da parte di Java, si è sentita sempre più impellente, quindi, la possibilità alla conversione di un documento XML in oggetti Java e viceversa, vediamone un esempio con l’uso di SAX.
Un programmatore che volesse utilizzare XML come formato dati della propria applicazione si troverà ad affrontare le seguenti problematiche:
Un documento XML è rappresentato da un struttura gerarchica ad albero, i cui elementi, identificati da alcuni tag, sono i nodi dell’albero e l’inclusione di un elemento dentro un’altro rappresenta la relazione padre-figlio tra nodo e nodo. I parser sono oggetti in grado di analizzare questo albero ed eventualmente manipolarlo, si suddividono in validanti e non validanti ed in altre categorie che ne determinano l’appartenenza. In questo articolo vedremo un esempio con un Event-Driven, basato su SAX API 2 ed in questo caso l’albero viene attraversato generando un evento ad ogni apertura o chiusura di un tag.
Scriviamo il nostro database XML (staff.xml):
<?xml version="1.0"?> <company> <staff> <firstname>Bianchi</firstname> <lastname>Vittorio</lastname> <nickname>bvitt73</nickname> <salary>34000</salary> </staff> <staff> <firstname>Rossi</firstname> <lastname>Mario</lastname> <nickname>mariotto34</nickname> <salary>28000</salary> </staff> </company>
SAX (Simple API for XML) è un tipo di parser che legge il file XML dall’inizio alla fine, come uno stream di dati ed ogni qualvolta incontra un elemento XML lo notifica all’applicazione. La notifica avviene mediante l’invocazione dei metodi specificati nell’interfaccia javax.sax.ContentHandler. Ad esempio quando un parser SAX incontra un elemento “<” durante la lettura di un documento XML, invoca il metodo callback startElement(), quindi invoca characters() e poi quando trova il simbolo “>” invoca il metodo endElement(). Costruiamo allora la nostra classe che ci consente di gestire i nostri dati dello staff:
package corso; import org.xml.sax.*; import org.xml.sax.helpers.*; public class StaffSAX extends DefaultHandler { boolean bfname = false; boolean blname = false; boolean bnname = false; boolean bsalary = false; public void startElement(String uri, String localName, String gName, Attributes attributes) throws SAXException { System.out.println("Elemento Iniziale: " + gName); if (gName.equalsIgnoreCase("firstname")) bfname = true; if (gName.equalsIgnoreCase("lastname")) blname = true; if (gName.equalsIgnoreCase("nickname")) bnname = true; if (gName.equalsIgnoreCase("salary")) bsalary = true; } public void endElement(String uri, String localName, String gName) throws SAXException { System.out.println("Elemento Finale: " + gName); } public void characters(char ch[], int start, int length) throws SAXException { if (bfname) { System.out.println("Cognome: " + new String(ch, start, length)); bfname = false; } if (blname) { System.out.println("Nome: " + new String(ch, start, length)); blname = false; } if (bnname) { System.out.println("Nickname: " + new String(ch, start, length)); bnname = false; } if (bsalary) { System.out.println("Salario E." + new String(ch, start, length)); bsalary = false; } } }
Una volta definita la classe che gestisce gli eventi prodotti dal parser, basterà fare questi passaggi:
Ecco il codice:
package corso; import javax.xml.parsers.*; public class Main { public static void main(String[] args) { try { StaffSAX handler = new StaffSAX(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("staff.xml", handler); } catch (Exception e) { e.printStackTrace(); } } }
Come avete potuto notare è abbastanza semplice scrivere un programma che elabori un database in formato XML in Java mediante un parser SAX. I vantaggi derivanti dall’uso di un tale tipo di parser possono essere così riassunti:
Magari se siete interessati, in futuro possiamo anche parlare di altri metodi di parsing di documenti XML in Java, per ora fermiamoci qui.
Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…
MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→
In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…
In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…
Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…
Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→