XStream: Leer ficheros XML desde Java
Hace unos días me surgió la necesidad de leer y escribir ficheros XML desde Java. Los ficheros que debía leer y escribir eran colecciones de beans, lo comente con mis compañeros y tras ver varias opciones me decante por utilizar XStream.
Las dos razones por la cuales me decante por utilizar esta librería son las siguientes:
-
Los ficheros XML que tenia que escribir para posteriormente leer, no debían seguir ninguna DTD o esquema.
-
Lo sencilla que es la librería XStream de aprender y utilizar.
Os podría seguir contando lo maravillosa que es la librería XStream, pero para eso ya esta su web. Solo comentaros algunas características:
-
Fácil de usar.
-
No requiere modificaciones en los objetos Java que se van a serializar.
-
Integración sencilla con otros APIs para XML
-
Soporte para Anotaciones (definición de alias para los atributos de una clase, conversores, omisión de tags, etc).
Veamos un ejemplo sencillo, vamos a suponer que el cliente nos a impuesto el siguiente modelo XML para persistir un Blog:
|
<blog> <autor> <nombre>Héctor Fuente</nombre> </autor> <entrada> <titulo>XStream: Leer ficheros desde Java en 3 Lineas(I)</titulo> <descripcion>XStream: Leer ficheros desde Java en 3 Lineas(I)</descripcion> </entrada> <entrada> <titulo>XStream: Leer ficheros desde Java en 3 Lineas(II)</titulo> <descripcion>XStream: Leer ficheros desde Java en 3 Lineas(II)</descripcion> </entrada> <entrada> <titulo>XStream: Leer ficheros desde Java en 3 Lineas(III)</titulo> <descripcion>XStream: Leer ficheros desde Java en 3 Lineas(III)</descripcion> </entrada> </blog> |
A partir de este modelo XML vamos a crear nuestro modelo de datos en Java, compuesto por 3 clases Blog, Autor y Entrada:
|
package es.fuenteperez.xstream.modelo;
public class Entrada {
private String titulo, descripcion;
public Entrada(){
}
public Entrada(String titulo, String descripcion) { this.titulo = titulo; this.descripcion = descripcion; } … |
|
package es.fuenteperez.xstream.modelo;
public class Autor {
private String nombre;
public Autor(){
}
public Autor(String nombre) { this.nombre = nombre; }
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; } } |
|
package es.fuenteperez.xstream.modelo;
import java.util.ArrayList; import java.util.List;
public class Blog {
private Autor autor; private List<Entrada> entradas = new ArrayList<Entrada>();
public Blog(){
}
public Autor getAutor() { return autor; }
public void setAutor(Autor autor) { this.autor = autor; }
public void add(Entrada entrada) { entradas.add(entrada); }
public List<Entrada> getEntradas() { return entradas; } } |
Las clases anteriores son simples bean, no hay que añadir absolutamente nada para poder utilizarlos con XStream, aunque puedas ver en todas el construcción por defecto no es necesario.
Ahora vamos ver como leer y escribir con XStream. Para escribir un fichero simplemente tenemos que utilizar el método toXML(Object o, OutputStream stream);
Como se puede ver es muy sencillo, le pasamos un Object y es capaz de generar de forma ‘mágica’ un XML, la magia se llama Reflection. XStream utiliza el Reflection API para conseguir la serialización con los objetos Java sin necesidad de ficheros de mapeo (DTD o esquemas).
En el siguiente fragmento de código podemos alguna opción más, que esta comentada a nivel de código.
|
package es.fuenteperez.xstream.main;
import java.io.FileNotFoundException; import java.io.FileOutputStream; import com.thoughtworks.xstream.XStream; import es.fuenteperez.xstream.modelo.Autor; import es.fuenteperez.xstream.modelo.Blog; import es.fuenteperez.xstream.modelo.Entrada;
public class TestEscritura { /** * @param args * @throws FileNotFoundException */ public static void main(String[] args){ try { //Creamos un objeto Blog Blog blog = new Blog(); //Creamos un autor y se lo asociamos al blog Autor autor = new Autor(“Héctor Fuente”); blog.setAutor(autor); //A continuacion creamos una serie de entradas para posteriomente asocialas al Blog Entrada entrada1 = new Entrada(“XStream: Leer ficheros desde Java en 3 Lineas(I)”, “XStream: Leer ficheros desde Java en 3 Lineas(I)”); Entrada entrada2 = new Entrada(“XStream: Leer ficheros desde Java en 3 Lineas(II)”, “XStream: Leer ficheros desde Java en 3 Lineas(II)”); Entrada entrada3 = new Entrada(“XStream: Leer ficheros desde Java en 3 Lineas(III)”, “XStream: Leer ficheros desde Java en 3 Lineas(III)”); blog.add(entrada1); blog.add(entrada2); blog.add(entrada3); //Creamos una instancia de XStream XStream xstream = new XStream(); //Instanciamos el metodo toXML pasamos como atributos el objeto Blog y un FileOutputStream xstream.toXML(blog, new FileOutputStream(“testXStream1.xml”)); //XStream nos da diferentes opciones a la hora de nombrar los nodos del fichero XML //para cambiar por ejemplo <es.fuenteperez.xstream.modelo.Autor> por Autor utilizamos el metodo alias xstream.alias(“blog”, Blog.class); xstream.alias(“autor”, Autor.class); xstream.alias(“entrada”, Entrada.class); xstream.toXML(blog, new FileOutputStream(“testXStreamAlias.xml”));
//Existen otras opciones como omitir por ejemplo el nombre de las colecciones //en nuestro caso podemos realizarlo sobre la coleccion entradas //Omitir el tag ‘entradas’, utilizamos el metodo addImplicitCollection xstream.addImplicitCollection(Blog.class, “entradas”); xstream.toXML(blog, new FileOutputStream(“testXStreamOmitirTags.xml”)); } catch (Exception e) { e.printStackTrace(); } } } |
En el ejemplo anterior se crean 3 ficheros XML (testXStream1.xml, testXStreamAlias.xml y testXStreamOmitirTags.xml) donde se puede ver texto XML generado según las opciones seleccionadas.
Ahora vamos ver como se pueden leer ficheros XML con XStream, para leer ficheros XML utilizamos el metodo xstream.fromXML(InputStream i).
La sencillez del siguiente fragmento de código seguro os va a sorprender:
|
package es.fuenteperez.xstream.main;
import java.io.FileInputStream; import java.io.FileNotFoundException; import com.thoughtworks.xstream.XStream; import es.fuenteperez.xstream.modelo.Blog;
public class TestLectura {
/** * @param args * @throws FileNotFoundException */ public static void main(String[] args) { try { //Creamos una instancia de XStream XStream xstream = new XStream(); //Para leer los datos del fichero //simplemente utilizamos el metodo fromXML //pasandole un FileInputStream Blog blog = (Blog) xstream.fromXML(new FileInputStream(“testXStream1.xml”)); } catch (Exception e) { e.printStackTrace(); System.out.println(“Tal vez debas ejecutar primero TestEscritura.java”); } } } |
Con una simple llamada a un método, obtenemos el objeto Blog.
Podéis descargaros el proyecto para Eclipse con el código que aparece en el artículo en la siguiente dirección:
http://www.fuenteperez.es/resources/testXStream.zip
Otras alternativas más formales para leer y escribir ficheros XML son JAXB o XMLBeans, si conocéis alguna otra librería de acceso a XML estaría encantado de que lo comentarais.
Salu2.



[…] - Advice On K&N 66 0901 X Stream Top Filter saved by Coreslider2008-08-14 - XStream: Leer ficheros XML desde Java saved by headachebaby2008-08-12 - K&N Xstream Universal Air Cleaner Lid For Serious Racers 9 […]