Procesando XML en Java [Xerces]

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!
23 Comentarios | deja el tuyo



muy bueno… tan pronto instale el eclipse en debian me pongo a probar.
Buenas,
Estoy intentando probar tu codigo para parsear unas xml que tengo. pero estoy teniendo realmente problemas con las librerias org.apache….
he ido a la pagina que dices y bajado el .zip luego he realizado el jar que crea el directorio con el xercesImpl.jar
pero ahi ya me he quedado.
estoy usando eclipse, y no se como añadir las librerias estas a las de eclipse….
llevo toda la mañana y estoy perdido jeje.
podrias echarme una mano?
muchas gracias por todo
un saludo
eh! ya lo solucione, al final era mas facil de todo lo que habia estado intentando
gracias por el codigo, mañana lo pruebo a ver que tal tira.
bla bla bla y mas bla
gracias
Cómo imprimo los resultados en un textbox, de un applet en vez de consola?
Hola Estoy Buscando Como Agregar El Archivo XSD Al XML Mediante Java Crees Que Puedas Ayudarme?
De Antemano Gracias.
Juan Francisco Gato Luis, como carajo hiciste para que te funcione?hijo de re mil puta.
Ah si es fácil,es fácil… hacete romper el orto por un traba
como haces con el problema q da las librerias de org.apache …
@pp ¿cuales problemas?
pp se puede referir a si logro compilar las librerias o no lo logro, de cualquier forma estas ya estan generadas si bajas el parser desde http://www.apache.org/dist/xerces/j/ ;
ahora el problema es que en el ejemplo se usan librerias deprecadas, dos para ser exactos:
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
Aunque igual funciona, supongo que no es lo optimo, tienes alguna idea de como hacerlo de una manera diferente, es decir usando librerias con soporte?,
De todas maneras gracias por el codigo y el ejemplo, salvo ese pequeno detalle, esta excelente para aprender.
Hola, donde esta el codigo para descargar que no lo veo. ???
Hola daniel.
Está en la segunda página:
http://casidiablo.net/procesamiento-xml-java-xerces/2/
Un saludo.
quiero generar el archivo xml desde un JSP, lo pinta en consola pero no lo crea
alguien que me ayude…..
Buen aPorte