Parser Java, interagire con i file XML
L’obiettivo di questo articolo è quello di fornire una serie di esempi grazie ai quali si cerca di descrivere in che modo è possibile interagire con file XML utilizzando i parser disponibili per Java, in particolare quelli a cui faremo riferimento sono:
DOM SAX JDOM
La motivazione che ci ha spinto a realizzare questa breve raccolta di esempi è legato alla possibilità di utilizzare i file XML in luogo delle usuali basi di dati, vale a tal proposito ricordare come lo stesso xml sia dotato di un proprio linguaggio di interrogazione (Xquery) che quindi in taluni scenari può renderlo particolarmente appetibile, si pensi ad esempio ad un programma che realizza un semplice rubrica telefonica, in questa circostanza utilizzare un db potrebbe determinare delle complicazioni di progetto non necessarie; per questa ragione al fine di cercare di fornire un quadro il più esaustivo possibile per ognuno degli esempi che proporremo nel seguito forniremo diverse versioni in modo da consentire al lettore di avere a propria disposizione un set di codici sufficientemente ampio da poter adottare nelle proprie soluzioni e consentirgli di valutare punti di forza e di debolezza che l’adozione dei diversi parser utilizzabili
Gli esempi che descriveremo, risolvono la seguente tipologia di problemi:
Lettura; (DOM,SAX,JDOM) Modifica; (DOM,JDOM) Creazione; (DOM, JDOM) Conteggio del numero di elementi. (DOM)
Ipotizziamo per la nostra serie di esempi che il file XML contenga il seguente set di informazioni
<?xml version=”1.0″?> <company>
<staff>
</staff> <staff>
</staff> </company>
<nome>Alex</nome> <cognome>The Great</cognome> <nickname>TheGreat</nickname> <salario>100000</salario>
<nome>Alex</nome> <cognome>The Small</cognome> <nickname>TheSmall</nickname> <salario>200000</salario>LETTURA DI UN FILE XML Soluzione DOM
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList;
import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File;
public class ReadXMLFile { public static void main(String argv[]) {
try {
File fXmlFile = new File(“c:\\file.xml”); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize();
System.out.println(“Root element :” + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName(“staff”); System.out.println(“———————–“);
for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode;
System.out.println(“Nome : ” + getTagValue(“nome”, eElement)); System.out.println(“Cognome : ” + getTagValue(“cognome”, eElement)); System.out.println(“Nick Name : ” + getTagValue(“nickname”, eElement)); System.out.println(“Salario : ” + getTagValue(“salario”, eElement));
} } catch (Exception e) {
} e.printStackTrace();
} private static String getTagValue(String sTag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); Node nValue = (Node) nlList.item(0);
}
return nValue.getNodeValue();
}
}
Soluzione SAX
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFile { public static void main(String argv[]) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean bfname = false; boolean blname = false; boolean bnname = false; boolean bsalary = false;
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
System.out.println(“Start Element :” + qName); if (qName.equalsIgnoreCase(“NOME”)) {
bfname = true; if (qName.equalsIgnoreCase(“COGNOME”)) {
}
blname = true; if (qName.equalsIgnoreCase(“NICKNAME”)) {
}
bnname = true; if (qName.equalsIgnoreCase(“SALARIO”)) {
bsalary = true;
}
} public void endElement(String uri, String localName,
String qName) throws SAXException { System.out.println(“Fine Elemento :” + qName);
}
} public void characters(char ch[], int start, int length) throws SAXException {
if (bfname) { System.out.println(“NOME : ” + new String(ch, start, length)); bfname = false;
}
}
}
}
if (blname) { System.out.println(“COGNOME : ” + new String(ch, start, length)); blname = false;
}
if (bnname) { System.out.println(“Nick Name : ” + new String(ch, start, length)); bnname = false;
}
if (bsalary) { System.out.println(“SALARIO: ” + new String(ch, start, length)); bsalary = false;
}
}; saxParser.parse(“c:\\file.xml”, handler);
} catch (Exception e) { e.printStackTrace();
}
SOLUZIONE JDOM
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder;
public class ReadXMLFile { public static void main(String[] args) {
SAXBuilder builder = new SAXBuilder(); File xmlFile = new File(“c:\\file.xml”); try {
Document document = (Document) builder.build(xmlFile); Element rootNode = document.getRootElement(); List list = rootNode.getChildren(“staff”); for (int i = 0; i < list.size(); i++) {
Element node = (Element) list.get(i);
System.out.println(“NOME : ” + node.getChildText(“nome”)); System.out.println(“COGNOME : ” + node.getChildText(“cognome”)); System.out.println(“Nick Name : ” + node.getChildText(“nickname”)); System.out.println(“Salario : ” + node.getChildText(“salario”));
} } catch (IOException io) {
System.out.println(io.getMessage()); } catch (JDOMException jdomex) {
System.out.println(jdomex.getMessage());
}
MODIFICA DI UN FILE XML
}
Inserimento di un nuovo nodo Update di un attributo già esistente Update di un valore già esistente Cancellazione di un elemento
}
File di partenza:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no” ?> <company>
<staff id=”1″> <nome>Alex</nome>
<cognome>The Great</cognome> <nickname>TheGreat</nickname> <salario>100000</salario>
</staff> </company>
Dopo le operazioni indicate:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no” ?> <company>
<staff > <conome>The Great</cognome>
<nickname>TheGreat</nickname> <salario> </salario>
</staff> </company>
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;
id=”2″
2000000
<eta>37</eta>
import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;
public class ModifyXMLFile { public static void main(String argv[]) {
try {
String filepath = “c:\\file.xml”; DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(filepath);
// Recupero l’elemento radice
Node company = doc.getFirstChild();
// Recupero i nodi staff,può non funzionare nel caso in cui il tag presenti degli spazi // o caratteri particlari, in casi come questi è preferibile usare // getElementsByTagName() // Node staff = company.getFirstChild();
Node staff = doc.getElementsByTagName(“staff”).item(0);
// update attributo staff
NamedNodeMap attr = staff.getAttributes(); Node nodeAttr = attr.getNamedItem(“id”); nodeAttr.setTextContent(“2”);
// append di un nuovo nodo a staff
Element age = doc.createElement(“eta”); age.appendChild(doc.createTextNode(“37”)); staff.appendChild(age);
// ciclo sugli elementi che costituiscono il nodo staff
NodeList list = staff.getChildNodes();
for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i);
// recupero l’elemento salario element, e ne aggiorno il valore
if (“salario”.equals(node.getNodeName())) { node.setTextContent(“2000000”);
}
//rimuovo l’elemento nome
if (“nome”.equals(node.getNodeName())) {
}
}
}
}
SOLUZIONE JDOM
import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter;
public class ModifyXMLFile { public static void main(String[] args) {
try {
staff.removeChild(node);
// salvo il contenuto aggiornato nel file xml
TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(filepath)); transformer.transform(source, result);
System.out.println(“Fatto!”);
} catch (ParserConfigurationException pce) { pce.printStackTrace();
} catch (TransformerException tfe) { tfe.printStackTrace();
} catch (IOException ioe) { ioe.printStackTrace();
} catch (SAXException sae) { sae.printStackTrace();
}
SAXBuilder builder = new SAXBuilder(); File xmlFile = new File(“c:\\file.xml”);
Document doc = (Document) builder.build(xmlFile); Element rootNode = doc.getRootElement();
// update dell’id associato all’attributo staff
Element staff = rootNode.getChild(“staff”); staff.getAttribute(“id”).setValue(“2”);
}
}
// inserimento di un nuovo elmento chiamato eta
Element age = new Element(“eta”).setText(“37”); staff.addContent(age);
// update del valore associato all’elemento salario
staff.getChild(“salario”).setText(“200000”); // cancellazione dell’elemento nome
staff.removeChild(“nome”); XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, new FileWriter(“c:\\file.xml”)); System.out.println(“il file è stato aggiornato con successo!”);
} catch (IOException io) { io.printStackTrace();
} catch (JDOMException e) { e.printStackTrace();
}
CREAZIONE DI UN NUOVO FILE XML Al termine dell’esecuzione del codice sarà prodotto un file xml contenente le seguenti informazioni:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no” ?> <company>
<staff id=”1″> <nome>Alexander</nome>
</staff> </company>
SOLUZIONE DOM
<cognome>Drastico</cognome> <nickname>TheGreat</nickname> <salario>1000000</salario>
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element;
public class WriteXMLFile { public static void main(String argv[]) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// creazione dell’elemento radice
Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement(“company”); doc.appendChild(rootElement);
// creazione dell’elemento staff
Element staff = doc.createElement(“Staff”); rootElement.appendChild(staff);
// creazione di un nuovo attributo ed assegnazione di un valore
Attr attr = doc.createAttribute(“id”); attr.setValue(“1”); staff.setAttributeNode(attr);
// in modo alternativo il medesimo risultato poteva essere ottenuto con il comando // staff.setAttribute(“id”, “1”);
// creazione dell’elemento nome
staff.appendChild(createElement(“nome”,”Alexander”));
// creazione dell’elemento cognome
staff.appendChild(createElement(“cognome”,”Drastico”)); // creazione dell’elemento nickname staff.appendChild(createElement(“nickname”,”TheGreat”)); // creazione dell’elemento salario staff.appendChild(createElement(“salario”,”1000000”));
// scrittura dei dati su file
TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(“C:\\file.xml”)); transformer.transform(source, result);
System.out.println(“Salvataggio completato!”);
} catch (ParserConfigurationException pce) { pce.printStackTrace();
} catch (TransformerException tfe) { tfe.printStackTrace();
}
} private element createElement(String label,String value) {
Element newElement = doc.createElement(label); nome.appendChild(doc.createTextNode(value)); return newElement;
} }
Soluzione JDOM
import java.io.FileWriter; import java.io.IOException; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter;
public class WriteXMLFile { public static void main(String[] args) {
}
}
try {
}
Element company = new Element(“company”); Document doc = new Document(company); doc.setRootElement(company);
Element staff = new Element(“staff”); staff.setAttribute(new Attribute(“id”, “1”)); staff.addContent(new Element(“nome”).setText(“alex”)); staff.addContent(new Element(“cognome”).setText(“drastico”)); staff.addContent(new Element(“nickname”).setText(“drastico”)); staff.addContent(new Element(“salario”).setText(“199999”));
doc.getRootElement().addContent(staff);
Element staff2 = new Element(“staff”); staff2.setAttribute(new Attribute(“id”, “2”)); staff2.addContent(new Element(“nome”).setText(“paolino”)); staff2.addContent(new Element(“cognome”).setText(“paerino”)); staff2.addContent(new Element(“nickname”).setText(“donald”)); staff2.addContent(new Element(“salario”).setText(“171717”));
doc.getRootElement().addContent(staff2);
XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, new FileWriter(“c:\\file.xml”));
System.out.println(“File salvato con successo!”); } catch (IOException io) {
System.out.println(io.getMessage());
Conteggio Elementi Soluzione SAX
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;
public class CountXMLElement { public static void main(String argv[]) {
}
}
try {
String filepath = “c:\\file.xml”; DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(filepath);
NodeList list = doc.getElementsByTagName(“staff”);
System.out.println(“Total of elements : ” + list.getLength());
} catch (ParserConfigurationException pce) { pce.printStackTrace();
} catch (IOException ioe) { ioe.printStackTrace();
} catch (SAXException sae) { sae.printStackTrace();
}
Commenti