Вы находитесь на странице: 1из 7

Generacin de archivos XML usando Xerces

En esta ocasin utilizaremos el API DOM para generar un archivo XML, que guardar informacin acerca de un listado de descargas ficticio. Como resultado, nuestra aplicacin 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; adems posee tres nodos hijos: titulo, ruta y hits. Teniendo en cuenta esto crearemos un pequeo 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 ARTCULO PUEDES DESCARGAR EL EJEMPLO COMPLETO) 20} 21 22 Ms adelante utilizaremos la clase GenerarXML.java, quien se encargar de crear el archivo XML. De momento detallaremos los pasos bsicos 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 invocacin a los mtodos que realizan estas tareas se encuentra en el mtodo main:

01 public static void main(String args[]) 02{ 03 GenerarXML generador = new GenerarXML(); // A. Crear el objeto(s) a Descargas 04 Descargas descarga = new Descargas(1, "Libros Java", 05 "http://casidiablo.net/libros.zip", 2546); 06 Descargas descarga2 = new Descargas(2, "Libros C Sharp", 07"http://casidiablo.net/libroscs.zip", 1654); 08 // B. Generar un documento XML usando Document generador.generaDocumentoXML(); 09 // C. Generar XML para el/los objeto(s) 10 generador.generarDocumentoXMLDescarga(descarga); 11 generador.generarDocumentoXMLDescarga(descarga2); 12 // D. Obtener el cdigo XML String textoXML = generador.obtenerTextoXML(); 13 generador.guardarDocumentoXML(textoXML); 14 15} System.out.println(textoXML); 16 Veamos con ms profundidad cmo funciona el segundo paso (Crear un objeto Document que contendr el documento XML):

01 02public void generaDocumentoXML() { try { 03 // 1. Crear objeto DocumentBuilderFactory 04 DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl.newInstance(); 05 // 2. A partir del objeto DocumentBuilderFactory crear un objeto 06DocumentBuilder DocumentBuilder docBuilder = dbFactory.newDocumentBuilder(); 07 // 3. Generar el documento XML 08 documentoXML = docBuilder.newDocument(); 09 } catch (Exception e) { 10 System.out.println("Error : " + e); } 11 // 4. Crear el elemento "descargas" 12 descarga = documentoXML.createElement(TAG_DESCARGAS); 13 // 5. Agregar al documento principal 14 documentoXML.appendChild(descarga); 15} 16 1. Creamos un objeto DocumentBuilderFactory, utilizando la el mtodo newInstance() de la clase DocumentBuilderFactoryImpl. 2. Creamos un objeto DocumentBuilder, con el que crearemos el objeto Document 3. Generamos el documento usando el mtodo newDocument() de DocumentBuilder 4. Se crea el elemento raz del documento XML y,

5. Se aade dicho elemento al objeto Document Despus de esto, ya tenemos listo nuestro objeto Document en donde crearemos el documento XML. El paso siguiente ser alimentar el documento XML con la informacin de nuestros objetos, lo cual se hace en el mtodo generarDocumentoXMLDescarga:

01 02 03public void generarDocumentoXMLDescarga(Descargas descargas) { 04 Element elemento; 05 Element item; // 1. Crear elemento 06 elemento = documentoXML.createElement(TAG_DESCARGA); 07 // 2. Asignar un atributo 08 elemento.setAttribute(TAG_ID, ""+descargas.getID()); 09 // 3. Aniadir elemento al documento 10 descarga.appendChild(elemento); // a. Crear item 11 item = documentoXML.createElement(TAG_TITULO); 12 // b. Asignar un dato al item 13 item.appendChild(documentoXML.createTextNode(descargas.getTitulo())); 14 // c. Aniadir el item elemento.appendChild(item); 15 // todos los items se crean sigiuendo el patron a, b, c 16 // el cdigo fuente completo se encuentra 17 //disponible para su descarga al final de este artculo 18} 19 20 1. Se crea un elemento (<descarga>) 2. Se asigna un atributo al elemento (<descarga id=xxx>) 3. Se aade el elemento al documento XML; posteriormente tenemos la creacin 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 aade el item al elemento (<descarga id=xxx><titulo>datos, muchos datos</titulo></descarga>) Para generar una salida del documento XML se utilizamos el mtodo generaTextoXML() el cual devuelve un string que contiene el documento XML: 01private String generaTextoXML() { StringWriter strWriter = null; 02 XMLSerializer seliarizadorXML = null; 03 OutputFormat formatoSalida = null; 04 try { 05 seliarizadorXML = new XMLSerializer(); strWriter = new StringWriter(); 06 formatoSalida = new OutputFormat(); 07 // 1. Establecer el formato 08 formatoSalida.setEncoding(XML_ENCODING); 09 formatoSalida.setVersion(XML_VERSION); formatoSalida.setIndenting(true); 10

11 12 13 14 15 16 17 18 19 20 21} 22 23 24 25

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 codificacin y versin del archivo XML, activamos la identacin 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 mtodo guardarDocumentoXML():

01 02public void guardarDocumentoXML(String texto) { try { 03 OutputStream fout = new FileOutputStream(NOMBRE_ARCHIVO_XML); 04 OutputStream bout = new BufferedOutputStream(fout); 05 OutputStreamWriter out = new OutputStreamWriter(bout, JAVA_ENCODING); out.write(texto); 06 out.flush(); 07 out.close(); 08 } catch (UnsupportedEncodingException e) { 09 //etc, bla, bla, catchichurri 10} 11 El mtodo guardarDocumentoXML() un objeto FileOutputStream para escribir los datos del documento XML en un archivo (cuyo nombre define la variable NOMBRE_ARCHIVO_XML).

Procesar archivos XML usando Xerces


Para procesar el archivo XML del ejemplo anterior, tambin utilizaremos DOM y un bean de la clase Descargas.java. Este tipo de procedimientos es mucho ms sencillo, y se compone bsicamente 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, la clase que realizar el parseo de XML es ProcesarXML.java, y en su constructor invocamos los mtodos que realizan los 3 pasos anteriores:

1 2public ProcesarXML() { listadoDescargas = new ArrayList(); 3 // A. Parsear el archivo XML 4 parsearArchivoXml(); // B. Obtener datos del documento XML 5 parsearDocumento(); 6 // C. Imprimir los resultados 7 imprimirResultados(); 8} 9 Pero veamos ms a fondo lo que hacen cada uno de estos mtodos. Por ejemplo, el mtodo parsearArchivoXml():

01 02public void parsearArchivoXml() { // 1. Obteher el objeto DocumentBuilderFactory 03 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 04 try { 05 // 2. Usar DocumentBuilderFactory para crear un DocumentBuilder DocumentBuilder db = dbf.newDocumentBuilder(); 06 // 3. Parsear a partir de un archivo 07 dom = db.parse("descargas.xml"); 08 } catch (ParserConfigurationException pce) { 09 // bla, bla, bla, catchapunchis... 10} 11 1. Crea un objeto DocumentBuilderFactory con el que se crearn el documento XML, pero antes 2. se utiliza para crear un objeto DocumentBuilder, el cual mediante el 3. mtodo parse() genera un documento a partir de un archivo. Ahora vamos con el mtodo ms importante, parsearDocumento(), el cual extrae los datos del documento XML y los almacena en beans de la clase Descargas: 01public void parsearDocumento() {raiz // 1. Obtener el documento 02 Element docEle = dom.getDocumentElement();

03 04 05 06 07 08 09 10 11 12 13} 14 15 16

// 2. Obtener un nodelist de elementos <descarga> NodeList nl = docEle.getElementsByTagName("descarga"); if (nl != null && nl.getLength() > 0) { for (int i = 0; i < nl.getLength(); i++) { // a. Obtener el elemento Element elemento = (Element) nl.item(i); // b. Obtener el objeto empleado Descargas descarga = obtenerDescarga(elemento); // c. Aniadirlo a la lista listadoDescargas.add(descarga); } }

1. Se crea un objeto Element, apartir del documento XML 2. Se crea un objeto NodeList, el cual contiene una lista de los nodos <descarga>, que luego sern procesados uno a uno en un ciclo for: 1. Se obtiene el elmento que el nodo actual represente 2. Se genera un bean Descarga con la informacin de dicho elemento (utilizando el mtodo obtenerDescarga()) 3. Se agrega a la lista de beans Pero cmo extrae los datos el mtodo obtenerDescarga()? Veamos:

01 02 public Descargas obtenerDescarga(Element elemento) { 03 int id = Integer.parseInt(elemento.getAttribute("id")); 04 String titulo = obtenerTexto(elemento, "titulo"); String ruta = obtenerTexto(elemento, "ruta"); 05 int hits = obtenerEntero(elemento, "hits"); 06 // Crear un objeto Descargas con los datos recibidos 07 Descargas d = new Descargas(id, titulo, ruta, hits); 08 return d; 09} 10private String obtenerTexto(Element elemento, String nombreEtiqueta) { String texto = null; 11 NodeList nl = elemento.getElementsByTagName(nombreEtiqueta); 12 if (nl != null && nl.getLength() > 0) { 13 Element el = (Element) nl.item(0); texto = el.getFirstChild().getNodeValue(); 14 } 15 return texto; 16} 17 18 Observemos cmo, utilizando el mtodo getAttribute podemos obtener el valor de un atributo de un elemento. As, si por ejemplo tenemos el elemento <descarga id=20></descarga>, la instruccin elemento.getAttribute(id) devolver una cadena cuyo valor es: 20. Ms adelante, en el mtodo obtenerTexto, podemos observar cmo obtener el valor de los nodos hijos de un elemento (usando el mtodo getNodeValue()). As, si por ejemplo tenemos un elemento de este tipo <padre><hijo>gay</hijo></padre>, tendramos que hacer lo siguiente para determinar el valor de la etiqueta <hijo>:

Crear un objeto NodeList, que contenga el listado de etiquetas <hijo> (puesto que un padre puede tener muchos hijos, por desgracia). [ NodeList nl = el.getElementsByTagName("hijo");] Crear un elemento por cada hijo; aunque en este ejemplo solo necesitamos el primer hijo [Element el = (Element) nl.item(0);] Obtener los datos del hijo [texto = el.getFirstChild().getNodeValue();] y al final, nos daramos cuenta que el hijo es gay Vaya decepcin

Lo dems, es decir, imprimir los resultados no creo que tenga que explicarlo demasiado. Se utiliza un mtodo toString() sobrecargado para imprimirlos en la consola:

1public void imprimirResultados() { 2 Iterator it = listadoDescargas.iterator(); while (it.hasNext()) 3 System.out.println(it.next().toString()); 4 } 5

Importante: cmo ejecutar los ejemplos


Puesto que estos ejercicios en java utilizan la librera xerces, es necesario descargarla de la pgina oficial. Luego de tener el archivo .jar, podramos compilarlo y ejecutarlo usando los siguientes comandos: #en linux javac -cp .:/ruta/xercesImpl.jar GenerarXML.java java -cp .:/ruta/xercesImpl.jar GenerarXML javac -cp .:/ruta/xercesImpl.jar ProcesarXML.java java -cp .:/ruta/xercesImpl.jar ProcesarXML #en windows javac -cp .;c:\xercesImpl.jar GenerarXML.java java -cp .;c:\xercesImpl.jar GenerarXML javac -cp .;c:\xercesImpl.jar ProcesarXML.java java -cp .;c:\xercesImpl.jar ProcesarXML

Вам также может понравиться