Lectura y escritura de documentos XML en Java

java3En este manual vamos a aprender a crear, guardar y modificar un sencillo documento XML en Java. El código que podréis encontrar a continuación es la base para entender el funcionamiento de DOM y SAX en Java y se puede utilizar para crear una aplicación más compleja.

Creación de ficheros XML en Java

En esta primera parte se muestra un sencillo código que nos permite crear la estructura XML necesaria para, posteriormente, crear el fichero XML. En este caso, se desea crear un fichero con el siguiente contenido.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
   <Casa>
      <Habitacion>
         <Color>Azul</Color>
      </Habitacion>
   </Casa>
</xml>

Dónde el elemento raíz es Casa. Esta casa contiene un conjunto de habitaciones todas ellas con ciertas características. Para simplificar, aquí solo hemos añadido una única habitación con una sola característica, su color. Podemos ver como el valor de ese color es azul.

A continuación podéis ver el código que se encarga de crear esta estructura XML. Si tenéis alguna duda con el código mostrado en esta página, podéis echarle un vistazo al API de Document o al API de Element.

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class XML {

    public static void main(String[] args) {
         Document document = null;
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         try{
            DocumentBuilder builder = factory.newDocumentBuilder();
            DOMImplementation implementation = builder.getDOMImplementation();
            document = implementation.createDocument(null, "xml", null);

            //Creación de elementos
            //creamos el elemento principal casa
            Element casa = document.createElement("Casa"); 
            //creamos un nuevo elemento. Casa contiene habitaciones
            Element habitacion= document.createElement("Habitacion");
            //creamos un nuevo elemento. Habitación tiene color
            Element color = document.createElement("Color"); 
            //Ingresamos la info. El color de esta habitación es azul
            Text valorColor = document.createTextNode("Azul"); 

            //Asignamos la versión de nuestro XML
            document.setXmlVersion("1.0"); 
            //Añadimos la casa al documento
            document.getDocumentElement().appendChild(casa); 
            //Añadimos el elemento hijo a la raíz
            casa.appendChild(habitacion); 
            //Añadimos elemento
            habitacion.appendChild(color); 
            //Añadimos valor
            color.appendChild(valorColor); 
         }catch(Exception e){
             System.err.println("Error: "+e);
         }
    }
}

Guardar fichero XML con formato

Una vez hemos creado la estructura XML correctamente, es hora de guardar el document resultante en un fichero XML con el formato adecuado. Para hacerlo, podemos utilizar la siguiente función.

// Volcamos XML al fichero
public static void guardaConFormato(Document document, String URI){
    try {
        TransformerFactory transFact = TransformerFactory.newInstance();

        //Formateamos el fichero. Añadimos sangrado y la cabecera de XML
        transFact.setAttribute("indent-number", new Integer(3));
        Transformer trans = transFact.newTransformer();
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");

        //Hacemos la transformación
        StringWriter sw = new StringWriter();
        StreamResult sr = new StreamResult(sw);
        DOMSource domSource = new DOMSource(document);
        trans.transform(domSource, sr);

        //Mostrar información a guardar por consola (opcional)
        //Result console= new StreamResult(System.out);
        //trans.transform(domSource, console);
        try {
            //Creamos fichero para escribir en modo texto
            PrintWriter writer = new PrintWriter(new FileWriter(URI));

            //Escribimos todo el árbol en el fichero
            writer.println(sw.toString());

            //Cerramos el fichero
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

Con esto ya tenemos nuestro documento XML generado y guardado en disco.

Añadir información al fichero XML

¿Cómo lo podemos hacer para añadir nuevas características a esta casa? En el siguiente código se explica como lo podemos hacer para añadir una terraza de un tamaño determinado a la casa creada anteriormente.

public static void AnadirCaracteristica(String URI){
    try {
        //Obtenemos el document del fichero XML existente
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        document = db.parse(new File(URI));
        document.getDocumentElement().normalize();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Creamos un nuevo elemento en la casa
    Element terraza = document.createElement("Terraza");
    //Le añadimos una característica
    Element tamano = document.createElement("Tamano");
    //Le añadimos su valor
    Text valor = document.createTextNode("20m2");

    //Añadimos la información a la casa ya existente
    NodeList nodoRaiz = document.getDocumentElement().getElementsByTagName("Casa");
    nodoRaiz.item(0).appendChild(terraza);
    terraza.appendChild(tamano);
    tamano.appendChild(valor);

    //Guardamos la nueva estructura la fichero XML
}

Búsqueda y eliminación de características.

En este ejemplo vamos a buscar todas las habitaciones de color azul que tengamos en nuestra casa y las vamos a eliminar. El resto de habitaciones que no cumplan con esta condición se van a mantener en el fichero XML.

public static void eliminarHabitacionAzul(String URI){
    try {
        //Cargamos el document del fichero XML existente
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        document = db.parse(new File(URI));
        document.getDocumentElement().normalize();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Obtenemos todas las habitaciones de la casa
    NodeList listaNodos = document.getDocumentElement().getElementsByTagName("Habitacion");
    Node nodo;
    for(int i=0; i<listaNodos.getLength(); i++){
        nodo = listaNodos.item(i);

        //Obtenemos una lista de todas las características de cada habitación
        NodeList listaCaracteristicas = nodo.getChildNodes();
        Node caracteristica;

        for(int z=0; z<listaCaracteristicas.getLength();z++){
            //Obtenemos cada característica individual
            caracteristica = listaCaracteristicas.item(z);
            //Si la característica es el color y su valor es azul la eliminamos
            if(caracteristica.getNodeName().equals("Color") && caracteristica.getTextContent().equals("Azul")){
                //El padre del nodo es Habitación y su padre Casa. Eliminamos Habitación de Casa.
                caracteristica.getParentNode().getParentNode().removeChild(caracteristica.getParentNode());
            }
        }
    }
}

Con estos ejemplos como base, ya podemos empezar a trabajar con documentos XML en Java.

Anuncios

One Response to Lectura y escritura de documentos XML en Java

  1. Pingback: Trabajar con Oracle y XML en Java | Aitor Rigada

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: