Procesamiento de documentos XML con XERCES Java Parser

Por:iuav, enviado 11 sep 2005

Procesamiento de documentos XML con XERCES Java Parser

 

Enviado por:
Irenio Luis Chagua Aduviri
Celular : +51-51-9755979
EMail: ichagua@gmail.com

Introducción

En este artículo se plantea una introducción, totalmente funcional, a la generación de documentos XML para su posterior creación de fichero XML utilizando DOM (Document Object Model) de XERCES Java Parser v2.7.1 de apache.org. En este artículo dejaremos de lado (de momento) bastantes aspectos relacionados con la manipulacion de documentos XML desde Java, como pueden ser los distintos tipos de parsers y funciones avanzadas, como la validación. Asimismo, se supone un cierto conocimiento de XML, su estructura y su función, ya que no se explicará en este artículo.

 

DOM Java Parser de XERCES

Cuando estamos usando documentos XML para intercambiar la información entre los diferentes sistemas, se presenta la necesidad de crear documentos XML. Buscando en el internet usted encontrará una enorme cantidad de ejemplos de cómo validar y analizar un documento XML. Pero cuando viene el momento de que usted tiene que crear un documento XML y enviarlo como un archivo de texto (por ejemplo character-stream, string, byte-array, etc.) a otro sistema, aveces se pone difícil de encontrar un ejemplo apropiado. Además, las distintas aplicaciones de la especificación de DOM (Document Object Model) están utilizando diferentes nombres de clases para hacer lo mismo

Uno de los analizadores de documentos XML para Java es XERCES que proporciona documentos XML estándar con el análisis y la generación. Los analizadores (que son válidos) están disponibles para muchos lenguajes de programación (Java, C++, etc.), aplicando los estándares del consorcio W3C como son XML y DOM (nivel 1 y 2), así como la especificación estándar SAX (versión 2).

Resultado del ejemplo

Ejecutando el ejemplo produce la siguiente salida como fichero de documento XML Personal.xml.

 

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <
Personal>
      <Empleado DNI="80114918">
        <Nombres>José de la Rosa Agüero Montero</Nombres>
        <FechaNacimiento>26-07-1985</FechaNacimiento>
        <Salario>1,250.00</Salario>
        <Edad>20</Edad>
      </Empleado>
      <Empleado DNI="80114918">
        <Nombres>Juan Carlos Demarini Castellanos</Nombres>
        <FechaNacimiento>03-08-1976</FechaNacimiento>
        <Salario>1,850.00</Salario>
        <Edad>29</Edad>
      </Empleado>
  </Personal>

Obviamente necesitaremos una clase que almacene los datos de nuestro documento XML de Personal.

  public class BeanEmpleado {
    private String dni;
    private String nombres;
    private Date fecnac;
    private Float salario;

    public void setNombres(String nombres) {
      this.nombres = nombres;
    }

    public String getNombres() {
      return nombres;
    }

    // ... y demás métodos similares

  }

 

código fuente GeneraXMLPersonal.java

En el método generaDocumentoXMLPersonal() se crean el encabezado del documento XML y el elemento Personal. En el método generaDocumentoXMLEmpleado(BeanEmpleado beanEmpleado), se generan los elementos empleado y asimismo los subelementos de éste, este método recibe como parámetro de entrada a una estructura de datos del empleado que está definido en la clase BeanEmpleado.

 

  private Document xmlDoc = null;
  private Element personal = null;
  public void generaDocumentoXMLPersonal() {
    try {
      DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl.newInstance();
      DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
      xmlDoc = docBuilder.newDocument();
    } catch(Exception e) {
      System.out.println("Error : " + e);
    }
    personal = xmlDoc.createElement(TAG_PERSONAL);
    xmlDoc.appendChild(personal);
  }
  public void generaDocumentoXMLEmpleado(BeanEmpleado beanEmpleado) {
      Element empleado;
      Element item;

      empleado = xmlDoc.createElement(TAG_EMPLEADO);
      empleado.setAttribute(TAG_EMPLEADO_DNI, beanEmpleado.getDNI());
      personal.appendChild(empleado);

      item = xmlDoc.createElement(TAG_NOMBRES);
      item.appendChild(xmlDoc.createTextNode(beanEmpleado.getNombres()));
      empleado.appendChild(item);
      //... y más elementos.
  }

 

Código para la generación de documento XML en cadena de texto (String)

En el siguiente fragmento de código se puede ver la forma de generar un documento XML creado mediante los métodos generaDocumentoXMLPersonal() y generaDocumentoXMLEmpleado(BeanEmpleado beanEmpleado) a una cadena de texto (String) para que pueda ser vista desde cualquier forma mediante la clase XMLSerializer().

  private String generaTextoXML() {
    StringWriter strWriter = null;
    XMLSerializer xmlSerializer = null;
    OutputFormat outFormat = null;
    try {
      xmlSerializer = new XMLSerializer();
      strWriter = new StringWriter();
      outFormat = new OutputFormat();

      outFormat.setEncoding(XML_ENCODING);
      outFormat.setVersion(XML_VERSION);
      outFormat.setIndenting(true);
      outFormat.setIndent(4);

      xmlSerializer.setOutputCharStream(strWriter);
      xmlSerializer.setOutputFormat(outFormat);
      xmlSerializer.serialize(xmlDoc);
      strWriter.close();
    } catch (IOException ioEx) {
      System.out.println("Error : " + ioEx);
    }
    return strWriter.toString();
  }

 

Código para Grabar en un fichero de texto el documento XML.

Ahora llega el momento para grabar en un fichero el documento XML que habíamos generado luego convertido en cadena de texto, ahora el contenido será guardado a un fichero XML mediante la clase OutputStreamWriter. Cabe precisar que en la versión de XML4J 4.1.2 (que también es de XERCES) había una clase llamado DOMWriter que se encargaba de guardar en un fichero el documento XML mediante el método writeNode(), pero tal clase ya no viene con la versión que estamos trabajando de XERCES.

  public void grabaDocumentoXML(String textoXML) {
    try {
      OutputStream fout= new FileOutputStream(NOMBRE_ARCHIVO_XML);
      OutputStream bout= new BufferedOutputStream(fout);
      OutputStreamWriter out = new OutputStreamWriter(bout, JAVA_ENCODING);
      out.write(textoXML);
      out.flush();
      out.close();
    }
    catch (UnsupportedEncodingException e) {
      System.out.println("La Máquina Virtual no soporta la codificación Latin-1.");
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
    }
    catch (Exception e) {
      System.out.println("Error : " + e);
    }
  }

 

Para Compilar y Ejecutar el programa

Compilar el código fuente con

javac -classpath ".;c:\xerces-2_7_1\xercesImpl.jar" GeneraXMLPersonal.java

Para ejecutar el código con

java -classpath ".;c:\xerces-2_7_1\xercesImpl.jar" GeneraXMLPersonal
 

Recursos

XERCES XML parser y otros: http://xml.apache.org/

 

Archivos Adjuntos

Otros Artículos en esta sección

¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Programación »