You are on page 1of 7

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:

01 02<?xml version="1.0" encoding="ISO-8859-1"?> 03<Descargas> <descarga id="1"> 04 <titulo>Libros Java</titulo> 05 <ruta>http://casidiablo.net/libros.zip</ruta> 06 <hits>2546</hits> </descarga> 07 <descarga id="2"> 08 <titulo>Libros C Sharp</titulo> 09 <ruta>http://casidiablo.net/libroscs.zip</ruta> 10 <hits>1654</hits> 11 </descarga> 12</Descargas> 13 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:

01 02 03public class Descargas { //Variables 04 private int id; 05 private String titulo; 06 private String ruta; private int hits; 07 //Constructor de la clase 08 public Descargas(int id, String titulo, String ruta, int hits){ 09 this.id = id; 10 this.titulo = titulo; 11 this.ruta = ruta; this.hits = hits; 12 } 13 //Metodos Setters y Getters 14 public void setID(int id) { 15 this.id = id; } 16 public int getID() { 17 return this.id; 18 } 19 //etc... (AL FINAL DEL ARTÍCULO PUEDES DESCARGAR EL EJEMPLO COMPLETO) 20} 21 22 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:

generarDocumentoXMLDescarga(descarga2). Agregar al documento principal 14 documentoXML.generarDocumentoXMLDescarga(descarga). Generar el documento XML 08 documentoXML = docBuilder. "Libros Java".net/libroscs. 05 "http://casidiablo.newInstance(). 15} 16 1. Se crea el elemento raíz del documento XML y. 12 // D. 07 // 3. 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.out. // A.zip". 1654).generaDocumentoXML(). Crear objeto DocumentBuilderFactory 04 DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl. "Libros C Sharp". 13 // 5.guardarDocumentoXML(textoXML). 2. 13 generador. Generar un documento XML usando Document generador. utilizando la el método newInstance() de la clase DocumentBuilderFactoryImpl. Crear el objeto(s) a Descargas 04 Descargas descarga = new Descargas(1.appendChild(descarga). 06 Descargas descarga2 = new Descargas(2. Generar XML para el/los objeto(s) 10 generador. Creamos un objeto DocumentBuilder. 11 generador. 05 // 2. la invocación a los métodos que realizan estas tareas se encuentra en el método main: 01 public static void main(String args[]) 02{ 03 GenerarXML generador = new GenerarXML(). con el que crearemos el objeto Document 3.println("Error : " + e).zip".obtenerTextoXML(). 2546). Obtener el código XML String textoXML = generador. 09 } catch (Exception e) { 10 System. 16 Veamos con más profundidad cómo funciona el segundo paso (Crear un objeto Document que contendrá el documento XML): 01 02public void generaDocumentoXML() { try { 03 // 1. 09 // C. 14 15} System. } 11 // 4. . Crear el elemento "descargas" 12 descarga = documentoXML. 07"http://casidiablo.    Crear los objetos a cargar en el documento XML (en nuestro ejemplo. Creamos un objeto DocumentBuilderFactory.newDocumentBuilder(). 08 // B.net/libros. A partir del objeto DocumentBuilderFactory crear un objeto 06DocumentBuilder DocumentBuilder docBuilder = dbFactory.out.newDocument().println(textoXML). Generamos el documento usando el método newDocument() de DocumentBuilder 4.createElement(TAG_DESCARGAS).

Asignar un atributo 08 elemento. Se crea un elemento (<descarga>) 2.getTitulo())). // 1. // a. 03 OutputFormat formatoSalida = null. 12 // b. Se añade el elemento al documento XML.createTextNode(descargas. ""+descargas. 07 // 2. 15 // todos los items se crean sigiuendo el patron a.appendChild(documentoXML. 02 XMLSerializer seliarizadorXML = null. Establecer el formato 08 formatoSalida. 09 // 3. Aniadir el item elemento. 10 .getID()). El paso siguiente será alimentar el documento XML con la información de nuestros objetos.setIndenting(true). b. c 16 // el código fuente completo se encuentra 17 //disponible para su descarga al final de este artículo 18} 19 20 1. Aniadir elemento al documento 10 descarga.setAttribute(TAG_ID. Se crea el item (<titulo></titulo>) b. 05 Element item.createElement(TAG_TITULO). 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: 01private String generaTextoXML() { StringWriter strWriter = null.setEncoding(XML_ENCODING). formatoSalida. posteriormente tenemos la creación de items. lo cual se hace en el método generarDocumentoXMLDescarga: 01 02 03public void generarDocumentoXMLDescarga(Descargas descargas) { 04 Element elemento. 06 formatoSalida = new OutputFormat(). ya tenemos listo nuestro objeto Document en donde crearemos el documento XML. 14 // c. Se añade dicho elemento al objeto Document Después de esto. Asignar un dato al item 13 item. Se asigna un atributo al elemento (<descarga id=”xxx”>) 3.appendChild(item).setVersion(XML_VERSION). 04 try { 05 seliarizadorXML = new XMLSerializer(). Crear item 11 item = documentoXML.createElement(TAG_DESCARGA). strWriter = new StringWriter(). 09 formatoSalida. Se asigna un dato al item (<titulo>datos. Se añade el item al elemento (<descarga id=”xxx”><titulo>datos. Crear elemento 06 elemento = documentoXML.appendChild(elemento). muchos datos</titulo>) c. para dicho elemento: a. 07 // 1.5.

05 OutputStreamWriter out = new OutputStreamWriter(bout.setOutputFormat(formatoSalida). JAVA_ENCODING). se asigna el tipo de codificación y versión del archivo XML. 04 OutputStream bout = new BufferedOutputStream(fout). o escribirlo en un archivo como lo hace el método guardarDocumentoXML(): 01 02public void guardarDocumentoXML(String texto) { try { 03 OutputStream fout = new FileOutputStream(NOMBRE_ARCHIVO_XML). 1. 08 } catch (UnsupportedEncodingException e) { 09 //etc. bla. Definir un objeto donde se generara el codigo seliarizadorXML. . // 3.setOutputCharStream(strWriter). // 4.flush().serialize(documentoXML). } return strWriter.close(). // 2. 07 out.11 12 13 14 15 16 17 18 19 20 21} 22 23 24 25 formatoSalida. Asignamos el tipo de formato que el objeto XMLSerializer generará 4. Un objeto XMLSerializer escribe los datos del documento XML sobre un objeto de flujo de salida. Utilizando un objeto de la clase OutputFormat. Aplicar el formato seliarizadorXML. activamos la identación y la ponemos a 4 espacios 2. bla. catchichurri 10} 11 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). 3. out.out.setIndent(4). 06 out. Serializar documento XML seliarizadorXML.write(texto). en este caso un objeto StringWriter. } catch (IOException ioEx) { System.close(). strWriter.println("Error : " + ioEx).toString(). Generamos el documento XML El string generado por generaTextoXML() podemos imprimirlo directamente en pantalla.

04 try { 05 // 2.newDocumentBuilder().getDocumentElement(). Imprimir los resultados 7 imprimirResultados(). bla.java. y se compone básicamente de los siguientes pasos:    Parsear el archivo XML (crear el objeto Document) Obtener los datos del documento XML Imprimir los datos del documento En este caso. Este tipo de procedimientos es mucho más sencillo. el cual extrae los datos del documento XML y los almacena en beans de la clase Descargas: 01public void parsearDocumento() {raiz // 1.xml"). el cual mediante el… 3. 06 // 3. Obtener datos del documento XML 5 parsearDocumento(). bla.java. … método parse() genera un documento a partir de un archivo. Obteher el objeto DocumentBuilderFactory 03 DocumentBuilderFactory dbf = DocumentBuilderFactory. Crea un objeto DocumentBuilderFactory con el que se crearán el documento XML. y en su constructor invocamos los métodos que realizan los 3 pasos anteriores: 1 2public ProcesarXML() { listadoDescargas = new ArrayList(). Parsear el archivo XML 4 parsearArchivoXml(). … se utiliza para crear un objeto DocumentBuilder.. // B. 10} 11 1. Obtener el documento 02 Element docEle = dom. parsearDocumento(). 3 // A. .parse("descargas. Ahora vamos con el método más importante. catchapunchis. 6 // C. 08 } catch (ParserConfigurationException pce) { 09 // bla.. Usar DocumentBuilderFactory para crear un DocumentBuilder DocumentBuilder db = dbf. Parsear a partir de un archivo 07 dom = db. pero antes… 2.newInstance(). 8} 9 Pero veamos más a fondo lo que hacen cada uno de estos métodos. la clase que realizar el parseo de XML es ProcesarXML. Por ejemplo. el método parsearArchivoXml(): 01 02public void parsearArchivoXml() { // 1. también utilizaremos DOM y un bean de la clase Descargas.Procesar archivos XML usando Xerces Para procesar el archivo XML del ejemplo anterior.

Se obtiene el elmento que el nodo actual represente 2. tendríamos que hacer lo siguiente para determinar el valor de la etiqueta <hijo>: . Se crea un objeto NodeList. en el método obtenerTexto. podemos observar cómo obtener el valor de los nodos hijos de un elemento (usando el método getNodeValue()). String nombreEtiqueta) { String texto = null. ruta.getFirstChild().add(descarga). Obtener un nodelist de elementos <descarga> NodeList nl = docEle. Se crea un objeto Element. Obtener el objeto empleado Descargas descarga = obtenerDescarga(elemento).getNodeValue(). "ruta"). Así. 16} 17 18 Observemos cómo.getLength(). // c. si por ejemplo tenemos el elemento <descarga id=”20″></descarga>. Se genera un bean Descarga con la información de dicho elemento (utilizando el método obtenerDescarga()) 3.getElementsByTagName(nombreEtiqueta).03 04 05 06 07 08 09 10 11 12 13} 14 15 16 // 2.parseInt(elemento.getAttribute(“id”) devolverá una cadena cuyo valor es: 20.item(0). i < nl. utilizando el método getAttribute podemos obtener el valor de un atributo de un elemento. 06 // Crear un objeto Descargas con los datos recibidos 07 Descargas d = new Descargas(id. 09} 10private String obtenerTexto(Element elemento. // b. apartir del documento XML 2. 12 if (nl != null && nl. Más adelante. que luego serán procesados uno a uno en un ciclo for: 1.getLength() > 0) { 13 Element el = (Element) nl.getElementsByTagName("descarga"). 04 String titulo = obtenerTexto(elemento. if (nl != null && nl. 14 } 15 return texto. String ruta = obtenerTexto(elemento. 08 return d. si por ejemplo tenemos un elemento de este tipo <padre><hijo>gay</hijo></padre>. el cual contiene una lista de los nodos <descarga>.getLength() > 0) { for (int i = 0. hits). 05 int hits = obtenerEntero(elemento. "hits"). titulo. 11 NodeList nl = elemento. Aniadirlo a la lista listadoDescargas. Así. Obtener el elemento Element elemento = (Element) nl. la instrucción elemento. "titulo"). } } 1. i++) { // a.item(i).getAttribute("id")). texto = el. Se agrega a la lista de beans Pero… ¿cómo extrae los datos el método obtenerDescarga()? Veamos: 01 02 public Descargas obtenerDescarga(Element elemento) { 03 int id = Integer.

:/ruta/xercesImpl. 4 } 5 Importante: cómo ejecutar los ejemplos Puesto que estos ejercicios en java utilizan la librería xerces.c:\xercesImpl.out.   Crear un objeto NodeList. [ NodeList nl = el.hasNext()) 3 System.next(). Se utiliza un método toString() sobrecargado para imprimirlos en la consola: 1public void imprimirResultados() { 2 Iterator it = listadoDescargas.:/ruta/xercesImpl. Luego de tener el archivo .jar” ProcesarXML. podríamos compilarlo y ejecutarlo usando los siguientes comandos: #en linux javac -cp .jar” GenerarXML javac -cp “.] Crear un elemento por cada hijo.. es decir.jar” ProcesarXML .java java -cp “.:/ruta/xercesImpl.] y al final.java java -cp “.jar” GenerarXML..getFirstChild(). que contenga el listado de etiquetas <hijo> (puesto que un padre puede tener muchos hijos. nos daríamos cuenta que el hijo es gay Vaya decepción… Lo demás.jar GenerarXML javac -cp .jar ProcesarXML..getElementsByTagName("hijo"). por desgracia).c:\xercesImpl.jar. while (it. aunque en este ejemplo solo necesitamos el primer hijo [Element el = (Element) nl.jar ProcesarXML #en windows javac -cp “.c:\xercesImpl.. es necesario descargarla de la página oficial.java java -cp .:/ruta/xercesImpl.iterator().item(0).java java -cp .println(it.jar GenerarXML.] Obtener los datos del hijo [texto = el. imprimir los resultados no creo que tenga que explicarlo demasiado.toString()).getNodeValue().c:\xercesImpl.