gentoo linux, java, software libre y otras hierbas
Ago, 14 2008 - 1:29 pm

Procesando XML en Java [Xerces]

duke java xml

En este artículo utilizaré un pequeño ejemplo para explicar cómo manipular documentos XML usando XERCES Java Parser. En este primer ejemplo usaré el API DOM, y la utilizaremos para generar un archivo XML y guardarlo en disco, y posteriormente procesaremos (parsearemos) dicho archivo para leer su información.

Nota: Sino tienes claro qué es un parser XML, qué es un API XML para Java y cuáles están disponibles, o aún tienes algunas dudas en relación con Java y XML, puedes/debes leer este pequeño artículo.

Generación de archivos XML usando Xerces

En esta ocasión utilizaremos el API DOM para generar un archivo XML, que guardará información acerca de un listado de descargas ficticio. Como resultado, nuestra aplicación generará el siguiente documento XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Descargas>
    <descarga id="1">
        <titulo>Libros Java</titulo>
        <ruta>http://casidiablo.net/libros.zip</ruta>
        <hits>2546</hits>
    </descarga>
    <descarga id="2">
        <titulo>Libros C Sharp</titulo>
        <ruta>http://casidiablo.net/libroscs.zip</ruta>
        <hits>1654</hits>
    </descarga>
</Descargas>

En el cual tenemos un elemento llamado descarga que contiene un atributo llamado id; además posee tres nodos hijos: titulo, ruta y hits. Teniendo en cuenta esto crearemos un pequeño bean (clase Descargas.java), que contiene dichos datos:

public class Descargas {
    //Variables
    private int id;
    private String titulo;
    private String ruta;
    private int hits;
    //Constructor de la clase
    public Descargas(int id, String titulo, String ruta, int hits){
        this.id = id;
        this.titulo = titulo;
        this.ruta = ruta;
        this.hits = hits;
    }
    //Metodos Setters y Getters
    public void setID(int id) {
        this.id = id;
    }
    public int getID() {
        return this.id;
    }
    //etc... (AL FINAL DEL ARTÍCULO PUEDES DESCARGAR EL EJEMPLO COMPLETO)
}

Más adelante utilizaremos la clase GenerarXML.java, quien se encargará de crear el archivo XML. De momento detallaremos los pasos básicos para realizar tareas de ese tipo:

  • Crear los objetos a cargar en el documento XML (en nuestro ejemplo, objetos tipo Descargas)
  • Crear un objeto Document que contendrá el documento XML
  • Generar los datos XML para los objetos creados en primer paso
  • Crear un archivo (o salida) XML

En nuestro ejemplo, la invocación a los métodos que realizan estas tareas se encuentra en el método main:

public static void main(String args[])
{
   GenerarXML generador = new GenerarXML();
   // A. Crear el objeto(s) a Descargas
   Descargas descarga = new Descargas(1, "Libros Java", "http://casidiablo.net/libros.zip", 2546);
   Descargas descarga2 = new Descargas(2, "Libros C Sharp", "http://casidiablo.net/libroscs.zip", 1654);
   // B. Generar un documento XML usando Document
   generador.generaDocumentoXML();
   // C. Generar XML para el/los objeto(s)
   generador.generarDocumentoXMLDescarga(descarga);
   generador.generarDocumentoXMLDescarga(descarga2);
   // D. Obtener el código XML
   String textoXML = generador.obtenerTextoXML();
   generador.guardarDocumentoXML(textoXML);
   System.out.println(textoXML);
}

Veamos con más profundidad cómo funciona el segundo paso (Crear un objeto Document que contendrá el documento XML):

public void generaDocumentoXML() {
    try {
        // 1. Crear objeto DocumentBuilderFactory
        DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl.newInstance();
        // 2. A partir del objeto DocumentBuilderFactory crear un objeto DocumentBuilder
        DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
        // 3. Generar el documento XML
        documentoXML = docBuilder.newDocument();
    } catch (Exception e) {
        System.out.println("Error : " + e);
    }
    // 4. Crear el elemento "descargas"
    descarga = documentoXML.createElement(TAG_DESCARGAS);
    // 5. Agregar al documento principal
    documentoXML.appendChild(descarga);
}

  1. Creamos un objeto DocumentBuilderFactory, utilizando la el método newInstance() de la clase DocumentBuilderFactoryImpl.
  2. Creamos un objeto DocumentBuilder, con el que crearemos el objeto Document
  3. Generamos el documento usando el método newDocument() de DocumentBuilder
  4. Se crea el elemento raíz del documento XML y,
  5. Se añade dicho elemento al objeto Document

Después de esto, ya tenemos listo nuestro objeto Document en donde crearemos el documento XML. El paso siguiente será alimentar el documento XML con la información de nuestros objetos, lo cual se hace en el método generarDocumentoXMLDescarga:

public void generarDocumentoXMLDescarga(Descargas descargas)
{
    Element elemento;
    Element item;
    // 1. Crear elemento
    elemento = documentoXML.createElement(TAG_DESCARGA);
    // 2. Asignar un atributo
    elemento.setAttribute(TAG_ID, ""+descargas.getID());
    // 3. Aniadir elemento al documento
    descarga.appendChild(elemento);
    // a. Crear item
    item = documentoXML.createElement(TAG_TITULO);
    // b. Asignar un dato al item
    item.appendChild(documentoXML.createTextNode(descargas.getTitulo()));
    // c. Aniadir el item
    elemento.appendChild(item);
    // todos los items se crean sigiuendo el patron a, b, c
    // el código fuente completo se encuentra
    //disponible para su descarga al final de este artículo
}

  1. Se crea un elemento (<descarga>)
  2. Se asigna un atributo al elemento (<descarga id=”xxx”>)
  3. Se añade el elemento al documento XML; posteriormente tenemos la creación de items, para dicho elemento:
    a. Se crea el item (<titulo></titulo>)
    b. Se asigna un dato al item (<titulo>datos, muchos datos</titulo>)
    c. Se añade el item al elemento (<descarga id=”xxx”><titulo>datos, muchos datos</titulo></descarga>)

Para generar una salida del documento XML se utilizamos el método generaTextoXML() el cual devuelve un string que contiene el documento XML:

private String generaTextoXML() {
   StringWriter strWriter = null;
   XMLSerializer seliarizadorXML = null;
   OutputFormat formatoSalida = null;
   try {
      seliarizadorXML = new XMLSerializer();
      strWriter = new StringWriter();
      formatoSalida = new OutputFormat();
      // 1. Establecer el formato
      formatoSalida.setEncoding(XML_ENCODING);
      formatoSalida.setVersion(XML_VERSION);
      formatoSalida.setIndenting(true);
      formatoSalida.setIndent(4);
      // 2. Definir un objeto donde se generara el codigo
      seliarizadorXML.setOutputCharStream(strWriter);
      // 3. Aplicar el formato
      seliarizadorXML.setOutputFormat(formatoSalida);
      // 4. Serializar documento XML
      seliarizadorXML.serialize(documentoXML);
      strWriter.close();
   } catch (IOException ioEx) {
      System.out.println("Error : " + ioEx);
   }
   return strWriter.toString();
}

  1. Utilizando un objeto de la clase OutputFormat, se asigna el tipo de codificación y versión del archivo XML, activamos la identación y la ponemos a 4 espacios
  2. Un objeto XMLSerializer escribe los datos del documento XML sobre un objeto de flujo de salida, en este caso un objeto StringWriter.
  3. Asignamos el tipo de formato que el objeto XMLSerializer generará
  4. Generamos el documento XML

El string generado por generaTextoXML() podemos imprimirlo directamente en pantalla, o escribirlo en un archivo como lo hace el método guardarDocumentoXML():

public void guardarDocumentoXML(String texto) {
   try {
      OutputStream fout = new FileOutputStream(NOMBRE_ARCHIVO_XML);
      OutputStream bout = new BufferedOutputStream(fout);
      OutputStreamWriter out = new OutputStreamWriter(bout, JAVA_ENCODING);
      out.write(texto);
      out.flush();
      out.close();
   } catch (UnsupportedEncodingException e) {
   //etc, bla, bla, catchichurri
}

El método guardarDocumentoXML() un objeto FileOutputStream para escribir los datos del documento XML en un archivo (cuyo nombre define la variable NOMBRE_ARCHIVO_XML).

Continúa leyendo la segunda parte, en donde aprenderemos a Parsear archivos XML. Vamos parce!

Páginas de esta entrada: 1 2

30 Comentarios | deja el tuyo

4 enlaces entrantes

26 Comentarios en “Procesando XML en Java [Xerces]”

  1. Paquito Inés dice:

    DEPRECAO!!!

  2. cesar dice:

    bien ahy con el tvto me sirvio bastante sigve asi man dejando mas tvtos para la gente q esta en nah en java ja.

  3. mary dice:

    Hola esta interesante el articulo pero estoy buscando un codigo para manipular datos xml desde java.si me puedes ayudar te agradecere por adelantado

  4. Kendall dice:

    Tengo una duda, todo esta perfecto pero yo necesito crear varios nodos Descarga. por ejemplo:

    Libros Java
    http://co.net/libros.zip
    2546

    Libros C Sharp
    http://c/libroscs.zip
    1654</hits

    Libros Java
    http://co.net/libros.zip
    2546

    Libros C Sharp
    http://c/libroscs.zip
    1654

    Es posible hacer eso?? no puedo crear un nodo principal :(

  5. LYRA dice:

    esta bueno pero kisiera saber mas sobre nodos en dom

  6. irati dice:

    Hola,
    estoy intentando obtener informacion de un doc xml bastante complejo desde netbeans y he seguido tus instrucciones pero me da error con “getDocumentElement” y “getElementsByTagName”. No puedo añadir las librerias necesarias…
    Alguna idea?
    Gracias por adelantado!!

  7. NovatoAprendiendo dice:

    Oye, cuando trato de parsear, el IDE (Netbeans) me pide Cast … Parse to (Document) o algo similar, le doy click, y me agrega a mi codigo

    documento = (Document) db.parse(“/Data/Datos.xml”);

    tambien cuanto trato con una linea asi

    documento = builder.parse( new File(/Data/Datos.xml) );

    me lo deja sin error, pero a la hora de querer usar una opcion como

    documento.getFirstChild;

    no me aparece la opcion =/

    • NovatoAprendiendo dice:

      ya resolvi mi problema, por si a alguien mas le sucede, es que estaba parseando un Document, de la clase javax.swing.text.Document y el que se usa en este ejemplo es org.w3c.dom.Document.

      Gracias, espero a alguien le sirva

¡Déjanos tu comentario!