Hay muchas técnicas
de manipular ficheros XML en el mundo
Java,
, y vamos a ver
una muy buena opción con JAXB (Java Architecture for XML
Binding )
Antes de hacer un ejemplo con esta tecnología, vamos a
montar el Kit de desarrollo de
Web Services,
donde viene incluido (utilizaremos este tutorial como base para
otros relacionados con Web Services)
No olvidéis que la primera fuente a consultar
siempre, es la original, el tutorial de Sun.
http://java.sun.com/webservices/docs/1.6/tutorial/doc/index.html
Lo descargamos del Web de Sun
Y arrancamos el ejecutable
Nos aparece el asistente
Elegimos la máquina virtual (un consejo, evitad
los espacios en los trayectos de instalación)
Elegimos la opción de utilizar un Tomcat como
contenedor para nuestra aplicaciones y servicios
Web
Nos descargamos el Tomcat para WSDP
Lo descomprimimos un directorio
Ahora seleccionamos el producto
recién instalado
Elegimos el directorio del resto de
componentes
Realizamos la instalación
típica
Aunque os muestro las opciones en la
personalizada….. que ya tenemos tema para un
montón de tutoriales
sobre las últimas especificaciones relacionadas con los
servicios web (sobre todo debemos estar atentos a la evolución de la seguridad)
Definimos el usuario que usuremos para manejar
remotamente el Tomcat
No olvidéis que este usuario hay que darlo de
alta en el TOMCAT
<!– |
o se os olvide leer las instrucciones finales (lo digo
porque al final hacemos ok, ok, ok y no nos funcionan las
cosas)
Copiamos los jar al directorio propuesto
Y ahora acabamos
Y al arrancar sobre los iconos creados ….. no
podría dar este pequeño error… solo tenemos que
ir al directorio de binarios de tomcat y localizar el fichero
catalina.bat (actualizando así el acceso
directo)
Primer ejemplo de JAXB
Creamos un proyecto dentro
de NetBeans 4.1. Será una aplicación Web
básica
Elegimos el nombre y trayecto
La gracia está en que a partir de un Schema
(esquema) XML podemos crear una estructura de
clases que nos permitan un acceso cómodo y seguro
(verificación de que hacemos lo que debemos en
compilación y no en ejecución)
Creamos el esquema
Le damos un nombre (libros.xsd)
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="libro"> <xsd:element name="libros" > </xsd:schema> |
Creamos un fichero XML que use ese esquema
Decimos que se valide contra un esquema
Y le damos los detalles (el fichero lo llamamos
libros.xml)
<?xml version="1.0" <libros xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.adictosaltrabajo.com/esquemas/libro |
Bueno, hasta ahora no hemos realizado nada raro ….
vamos con la parte específica
Invocamos fichero xjc.bat pasando como
parámetro el trayecto del fichero xml. También
podemos especificar el directorio donde se generarán las
clases
xjc.bat -d directoriofinal
ficheros.xsd
Ahora, en nuestro proyecto le vamos a incorporar los JAR
de JAXB
Las elegimos
Y pinchando sobre las propiedades del proyecto,
añadimos el trayecto de los ficheros generados
automáticamente.
Vemos es aspecto de nuestro proyecto
Y ya solo nos queda escribir el código
específico.
package adictosjaxb; import import import javax.xml.bind.*; import java.io.*; import java.util.*; /** * * @author Roberto Canales */ public class Main { public static void depura(String cadena) System.out.println("adictosjaxb: " + } public static void main(String[] args) depura("Empezamos la try { JAXBContext jc = JAXBContext.newInstance( Unmarshaller u = // es una chapuza pero para el ejemplo nos InputStream in = new if(in == null) { depura("No encuentro el fichero"); return; } // construimos el modelo a partir el stream de Libros mifichero = (Libros)u.unmarshal( in // recuperamos la lista de libros List mislibros = int numero = mislibros.size(); depura("El numero de libros es " +numero for (int i = 0; i < numero; i++) Libro libroconcreto = depura(libroconcreto.getTitulo() + " – de – " } // ahora añadimos un libro LibroTypeImpl nuevoLibro = new // establecemos los elementos nuevoLibro.setTitulo("Domina tu nuevoLibro.setAutor("Anónimo"); // añadimos a la lista mislibros.add(nuevoLibro); // vamos a pintar ahora el arbol XML generado Marshaller formateador = formateador.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, formateador.marshal( mifichero, System.out // ahora escribimos a un fichero, en el formateador.setProperty(Marshaller.JAXB_ENCODING, FileOutputStream salida = new formateador.marshal( mifichero, } catch(Exception e) // esto es otra { depura("el error es " + } } } |
Si lo analizamos, veremos que con 4 líneas,
hacemos operaciones
comunes…
Recuperar el contenido de un fichero:
JAXBContext jc = JAXBContext.newInstance( Unmarshaller u = // es una chapuza pero para el ejemplo nos InputStream in = new if(in == null) { depura("No encuentro el fichero"); return; } // construimos el modelo a partir el stream de Libros mifichero = (Libros)u.unmarshal( in // recuperamos la lista de libros List mislibros = int numero = mislibros.size(); depura("El numero de libros es " +numero for (int i = 0; i < numero; i++) Libro libroconcreto = depura(libroconcreto.getTitulo() + " – de – " } |
Insertar un nuevo nodo
// ahora añadimos un libro LibroTypeImpl nuevoLibro = new // establecemos los elementos nuevoLibro.setTitulo("Domina tu nuevoLibro.setAutor("Anónimo"); // añadimos a la lista mislibros.add(nuevoLibro); |
Volcar el contenido a la pantalla
// vamos a pintar ahora el arbol XML generado Marshaller formateador = formateador.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, formateador.marshal( mifichero, System.out |
Y escribir el contenido en un fichero
// ahora escribimos a un fichero, en el formateador.setProperty(Marshaller.JAXB_ENCODING, FileOutputStream salida = new formateador.marshal( mifichero, |
La opción de JAXB, junto con JDOM, es una de mis
preferidas para manipular de un modo rápido y sencillo
ficheros XML.
De todos modos podemos sacar algunas conclusiones
importantes:
- Cada vez hay más técnicas para hacer lo
mismo. - Los conocimientos (aparentemente) cada vez tienen un
ciclo de
vida más corto - No es tan importante el manipular el fichero XML como
definir bien su esquema desde un principio (lo que requiere
saber analizar).
Roberto Canales