Ago, 14 2008 - 1:29 pm

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);
}
- Creamos un objeto DocumentBuilderFactory, utilizando la el método newInstance() de la clase DocumentBuilderFactoryImpl.
- Creamos un objeto DocumentBuilder, con el que crearemos el objeto Document
- Generamos el documento usando el método newDocument() de DocumentBuilder
- Se crea el elemento raíz del documento XML y,
- 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
}
- Se crea un elemento (<descarga>)
- Se asigna un atributo al elemento (<descarga id=”xxx”>)
- 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();
}
- 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
- Un objeto XMLSerializer escribe los datos del documento XML sobre un objeto de flujo de salida, en este caso un objeto StringWriter.
- Asignamos el tipo de formato que el objeto XMLSerializer generará
- 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
23 Comentarios | deja el tuyo