Parser Java, interagire con i file XML

di - 1 giugno 2012 in Programmazione

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();

}

Share

Promozioni

Potrebbe interessarti



Commenti