Está en la página 1de 79

Parte I.

INTRODUCCIN
1.1 Qu es JAXB?
El Lenguaje de Marcado Extensible (XML) y la tecnologa Java son compaeros o socios de trabajo en la ayuda a los desarrolladores para intercambiar datos y programas a travs de Internet. JAXB simplifica el acceso a un documento XML de un programa Java representando el documento XML en un programa en formato Java, esto es, provee a los desarrolladores de aplicaciones Java, una forma rpida y conveniente para enlazar o vincular esquemas XML a representaciones java. JAXB provee de mtodos para desorganizar (unmarshal) documentos instancias XML en rboles de contenido (generados en cdigo Java), para despus utilizar los mismos y generar mediante el mtodo organizar (marshal) instancias XML de las que fueron generados. Esto nos proporciona la flexibilidad de manejar datos XML en una plataforma neutral adems de no requerir tratar o conocer las tcnicas de programacin de XML al ocultar ciertos detalles complejos de sus relaciones. JAXB proporciona potencia sin tener las desventajas de que el procesamiento de las aplicaciones sea pesado y/o complejo como ocurre con SAX o DOM. Las clases generadas JAXB describen solo relacin real definida en los esquemas fuentes. El resultado de lo anterior son datos xml altamente portables que unido a un cdigo java portable puede ser usado para crear flexibles y ligeras aplicaciones y servicios web.

1.2 Caractersticas de JAXB


Al usar una aplicacin JAXB obtenemos diversos beneficios, adems contamos con una flexibilidad mucho mayor que otras aplicaciones nos dan, las caractersticas ms importantes por las cuales nos conviene utilizar JAXB son las siguientes:

JAXB usa Tecnologa Java y XML Garantiza Datos Vlidos Es Rpida Es Fcil de Usar Puede Restringir Datos Es Personalizable Es Extensible

Para comprender a detalle los beneficios de utilizar JAXB se da una explicacin a continuacin sobre cada una de estas caractersticas.

1.2.1 Las aplicaciones JAXB usan Tecnologa Java y XML


Una de las cualidades ms importantes de las aplicaciones de JAXB es que estn escritas en el lenguaje de programacin Java y pueden procesar datos XML. Para poder entender las implicaciones de estas caractersticas es necesario primeramente comprender porque es tan importante la tecnologa Java y el lenguaje XML, adems de cmo es su implementacin. El lenguaje XML es una forma, estndar industrial e independiente del sistema, de representar datos. Los datos que se representan usando XML se pueden publicar en mltiples medios porque XML describe la estructura de los datos, no su formato, al contrario que el HTML, Los datos de XML se pueden pasar entre aplicaciones porque la estructura de los datos se puede especificar en un esquema, lo que permite que un analizador de sintaxis valide y procese los datos que siguen el esquema. El lenguaje XML no proporciona etiquetas, como lo hace HTML, se hace uso de un esquema para definir nuestras propias etiquetas, y estas a su vez describen nuestros datos. Los datos XML son fciles de trabajar porque estn escritos en un formato de texto simple, legible por los seres humanos y el software de edicin de texto. Por estas razones, XML se est convirtiendo rpidamente en un mtodo comn para el intercambio de datos entre aplicaciones, especialmente aplicaciones de empresa de negocio-a-negocio. Las aplicaciones escritas en el lenguaje de programacin de Java son portables: ya que cualquier sistema con una mquina virtual Java puede
2

ejecutar los bytecode producidos compilando una aplicacin Java. Con el cdigo portable que la tecnologa de Java proporciona, XML es an ms til en el contexto de compartir datos entre las aplicaciones. Las aplicaciones, especialmente aplicaciones basadas en Web, necesitan la ayuda de la tecnologa de Java para analizar y procesar los datos de una manera independiente de la plataforma. Asimismo, las aplicaciones Java necesitan el formato de datos independiente de la plataforma que XML proporciona para comunicar y compartir informacin. Podramos decir que JAXB proporciona un puente entre estas dos tecnologas complementarias. Ya que JAXB incluye un compilador que asocia un esquema a un conjunto de clases Java. Una vez que tengamos nuestras clases, podremos construir las representaciones de objetos Java de los datos XML que siguen las reglas que el esquema define. Al igual que un documento XML es un ejemplar de un esquema, un objeto Java es un ejemplar de una clase. As, JAXB permite que creemos los objetos Java en el mismo nivel conceptual que los datos XML. La representacin de nuestros datos de esta manera permite que los manipulemos de manera semejante como manipularamos objetos de Java, haciendo ms fcil la creacin de aplicaciones para procesar datos XML. Una vez que tengamos nuestros datos en la forma de objetos Java, es fcil acceder a ellos. Adems, despus de trabajar con los datos, podemos escribir los objetos Java en un nuevo documento XML. Con el acceso fcil a los datos XML que proporciona JAXB, solamente necesitamos escribir aplicaciones que realmente utilizarn los datos, en vez gastar el tiempo en escribir cdigo para formatear los datos.

1.2.2 Las Aplicaciones JAXB son Rpidas


Dos APIs de uso general para analizar XML son SAX (API simple para XML) y DOM (modelo del objeto del documento). Un analizador de sintaxis de SAX es un analizador de sintaxis dirigido por eventos, lo que significa que reacciona a los pedazos del documento mientras lo est analizando; no salva ninguna parte del documento en memoria. Un analizador de sintaxis de DOM construye una estructura de datos del documento en la memoria cuyo contenido puede ser manipulado, pero es mucho ms lento que un analizador de sintaxis SAX. Una aplicacin JAXB, por otra parte, tiene la velocidad de un analizador de sintaxis SAX y de la capacidad de almacenaje de datos de un analizador de sintaxis DOM. Aunque los analizadores de sintaxis SAX son rpidos, los primeros prototipos de JAXB han demostrado que JAXB puede
3

ser ms rpido que los analizadores de sintaxis SAX. JAXB hace ms rpidamente el anlisis porque las clases generadas estn precompiladas y contienen la lgica del esquema, de tal modo que evitan la interpretacin dinmica que un analizador de sintaxis SAX debe realizar. Una aplicacin JAXB puede construir una estructura de datos en memoria como un analizador de sintaxis DOM. Sin embargo, al contrario que DOM, no incluye muchas de las funciones adicionales para la manipulacin del rbol. Al contrario que una aplicacin DOM, una aplicacin JAXB es especfica de un esquema: No podemos utilizarla para procesar los documentos de XML que se basan en otro esquema. Por estas razones, una aplicacin JAXB utiliza mucho ms eficientemente la memoria que DOM.

1.2.3 Las Aplicaciones JAXB son Fciles de Crear y de Usar


Puesto que todo el cdigo de proceso se genera por nosotros, JAXB es ms fcil de utilizar que la mayora de los analizadores de sintaxis XML: Con slo un stream de entrada podemos tener acceso al contenido. Adems, la mayora de los analizadores de sintaxis XML se limitan al tipado de datos ofrecido por un DTD. Un DTD es un tipo de lenguaje de esquema de XML. Todava necesitamos proporcionar al cdigo de conversin, que puede ser propenso a errores y difcil de mantener. JAXB genera automticamente el cdigo que podemos personalizar para que realice la conversin de contenidos por nosotros. Si sabemos cmo programar en el lenguaje Java y tenemos un mnimo conocimiento de XML, podremos empezar a usar JAXB. Adems, como las clases generadas cumplen las convenciones del API Java, es incluso ms fcil empezar a trabajar con JAXB.

1.2.4 Las Aplicaciones JAXB Pueden Convertir Datos


Aunque un documento de XML est especificado para un esquema, en este momento, un esquema est limitado en cmo puede especificar firmemente el contenido de un documento de XML. Las aplicaciones de intercambio de datos necesitan tipado de datos formal. XML 1,0 no proporciona explcitamente a tipado de datos ms all de expresar tipos como valores del atributo; estos valores del atributo deben entonces ser interpretados analizando el cdigo proporcionado. Es decir podemos incorporar cualquier tipo de datos
4

que deseemos entre dos etiquetas, tales como nmeros enteros o cadenas, mientras la estructura del documento est conforme con la especificacin del DTD. Pero lo que desearemos con frecuencia es poder convertir los datos, por ejemplo, para especificar que solamente un nmero entero se puede contener entre dos etiquetas <quantity>. JAXB proporciona capacidades tanto para la estructura como para la validacin del contenido en el cdigo generado, que podemos personalizar. Ms importante, puesto que JAXB genera el cdigo Java, podemos asignar tipos exclusivos del lenguaje de programacin Java, tal como Date o BigDecimal, a nuestros elementos.

1.2.5 Las Aplicaciones JAXB Pueden Personalizarse


Antes de generar las clases Java de desde nuestro DTD, escribimos lo que se llama un esquema de unin, que contiene instrucciones de cmo generar las clases. El esquema de unin se escribe en un lenguaje de unin basado en XML, cuyas construcciones utilizamos para escribir al esquema de unin de modo que podamos especificar cmo se generan las clases. Una de las personalizaciones ms tiles son las conversiones de tipos de datos. Por ejemplo, como se mencion en secciones anteriores, podemos especificar en el esquema de unin que el elemento quantity slo debe contener nmeros enteros. Adems de las conversiones de tipos de datos, podemos utilizar el esquema de unin para controlar los nombres de las clases, los paquetes, y los tipos; y podemos generar constructores, interfaces, y enumeraciones personalizadas. El esquema de unin tambin permite que manejemos la evolucin del esquema. Si nos anticipamos la cambio de nuestro esquema, el esquema de unin proporcionar constructores especiales que definen uniones flojas que permitan ms flexibilidad. Cuando el esquema se desarrolle, todo lo que necesitamos hacer es editar el esquema de unin y ejecutar el compilador del esquema otra vez para crear las clases que reflejan los cambios. Si intentramos cambiar las clases en lugar del esquema, una vez que ejecutramos el compilador del esquema otra vez, los cambios seran sobrescritos. Porque las instrucciones de unin se especifican en el esquema de unin a parte del esquema y el cdigo cuando se desarrolle el esquema, lo tendremos mucho ms fcil para mantener la aplicacin.

1.2.6 Las Aplicaciones JAXB son Extensibles


Una vez que hayamos generado las clases Java, podremos utilizarlas sin modificaciones, o subclasificarlas para proporcionar funcionalidades adicionales. Los desarrolladores de JAXB disearon el proceso de unin para hacer que la derivacin de subclases sea sencillo.

1.3 Arquitectura de JAXB

Como se muestra en la figura anterior, una implementacin JAXB incluye los siguientes componentes principales: Componente Descripcin
Un Esquema XML usa la sintaxis XML para describir las relaciones entre los elementos, atributos y entidades en un documento XML. El esquema XML define un patrn de documentos XML al que deben adherirse con una estructura definida por reglas y restricciones de datos especificadas en el esquema. Por default, el compilador vinculante JAXB une las clases java y los paquetes a un esquema fuente XML basado en las reglas definidas en la especificacin JAXB en lo que se conoce como un esquema de unin o vinculacin. Puede ser que algunas veces las reglas por default de vinculacin no sean suficientes para lo que necesitas. JAXB soporta personalizaciones y sobrescribe las reglas de vinculacin por default por el las personalizaciones de vinculacin.

Esquema XML

Personalizacione s Binding

Compilador vinculante

El compilador vinculante JAXB es el ncleo del modelo de procesamiento JAXB. Su funcin es transformar, o vincular, un esquema XML fuente a un conjunto de clases contenido JAXB en el lenguaje de programacin Java. Bsicamente, corres el compilador JAXB usando un esquema XML (opcionalmente con declaraciones de vinculacin) como entrada, y el compilador vinculante genera clases java con las restricciones en el esquema fuente XML. La implementacin del framework de JAXB vinculante es una API de tiempo de ejecucin que provee de interfaces para desorganizar, organizar y validar contenido XML en una aplicacin Java. El framework vinculante comprende las interfaces definidas en el paquete javax.xml.bind. Estas son clases derivadas del esquema generadas por el compilador JAXB. Las clases especficas variaran dependiendo del esquema de entrada. En el contexto de JAXB, una aplicacin java es una aplicacin cliente que usa el marco para desorganizar datos XML, validar y modificar el contenido de objetos java, y organizar el contenido de regreso a datos XML. Tpicamente, el marco de JAXB es envuelto en una aplicacin java grande que puede proveer caractersticas UI, funciones de transformacin XML, datos procesados, o lo que sea que sea deseado El contenido que es desorganizado como entrada para el framework JAXB, eso es, una instancia documento XML, de la cual es generada una representacin java en forma de contenido de rbol. En la practica, el termino documento puede no tener el significado convencional, como una instancia documento XML, puede en su lugar, tomar la forma de flujos de datos pasados entre aplicaciones, o conjuntos de campos de bases de datos, o de infosets XML. En JAXB, el proceso de desorganizacin soporta la validacin de una entrada documento XML contra las restricciones definidas en el esquema fuente. Este proceso de validacin es opcional. El contenido XML es organizado fuera de un documento XML. En JAXB, organizar incluye parsear un objeto rbol de XML y escribirlo en un documento XML que es una representacin precisa del documento original XML, y es vlido con respecto al esquema fuente. JAXB puede organizar datos XML en documentos XML, manejadores de contenido SAX, y nodos DOM

Implementacin de javax.xml.bind Clases derivadas del esquema

Aplicacin java

Documento de entrada XML

Salidas de documentos xml

1.4 El proceso de vinculacin de JAXB


La siguiente figura muestra lo que ocurre durante el proceso de vinculacin JAXB

Tpicamente para generar una aplicacin JAXB, hay una fase de desarrollo de aplicacin en la cual las clases JAXB son generadas y compiladas, y una implementacin vinculante es construida, seguida por una fase de utilizacin en la cual las clases JAXB generadas son usadas para procesar contenido XML en una continuo vivir en un escenario de produccin. 1. Vincular el esquema. El primer paso del proceso es enlazar el esquema XML fuente en un conjunto de clases Java que representen ese esquema. Para realizar lo anterior un esquema XML es usado como entrada para el compilador vinculante de JAXB para generar clases JAXB que lo representen. Todas los proveedores de JAXB proveen una herramienta llamada compilador enlazante para vincular un esquema (la manera en que el compilador es invocado puede ser especfica de la implementacin). Ya que las clases son una implementacin especfica, las clases generadas por otro compilador enlazante en una implementacin JAXB probablemente no funcionarn con otra implementacin JAXB. Por lo tanto si cambias a otra implementacin JAXB, deberas

revincular el esquema con el compilador enlazante suministrado por esa aplicacin.

Compilar las clases generadas. Todas las clases, interfaces, archivos fuentes, y cdigo generado debe ser compilado.

2.

Crear la aplicacin JAXB que utilice las clases y dems archivos generados por el compilador enlazante y compilarla. Una vez hecho lo anterior, estas listo para convertir documentos xml a clases java o viceversa; esto lo podemos realizar mediante: Desorganizar y generacin de rbol de contenido. Los documentos XML escritos de acuerdo a las restricciones en el esquema fuente son desorganizados por el framework vinculante JAXB. Note que JAXB tambin soporta desorganizacin de datos de otras fuentes que archivos/documentos, tales como nodos DOM, buffers de cadenas, fuentes SAX, y cosas as. Generar el rbol de contenido. El proceso de desorganizacin genera un rbol de contenido de objetos de datos instanciados de la clase generada JAXB; este rbol de contenido representa la estructura y contenido de los documentos fuentes XML. Validacin (Opcional). El proceso de desorganizacin opcionalmente incluye la validacin de los documentos fuentes XML antes de generar el rbol de contenido. Si modifica el rbol de contenido puede tambin usar la operacin de validar JAXB para validar los cambios antes de organizar el contenido al documento XML que previamente se haba desorganizado. Procesos de contenido. La aplicacin cliente puede modificar los datos XML representados por el rbol de contenido Java por el uso de interfaces generadas por el compilador vinculante.

Marshalling que es la operacin contraria a unmarshalling, con el cual conviertes objetos Java en una representacin documento XML.

1.5 Framework vinculante JAXB


El framework vinculante de JAXB es implementado en tres paquetes java: El paquete javax.xml.bind, contiene clases e interfaces para la realizacin de operaciones tales como desorganizacin, organizacin y validacin. El paquete javax.xml.bind.util contiene clases de utilidad que pueden ser usadas por una aplicacin cliente para manejar los eventos de organizacin, desorganizacin y validacin. El paquete de javax.xml.bind.helper provee una implementacin parcial por default para algunas de las interfaces javax.xml.bind. Las implementaciones JAXB pueden extender estas clases e implementar los mtodos abstractos. Este paquete est designado para los proveedores de implementaciones JAXB.

1.5.1 El paquete javax.xml.bind


El paquete javax.xml.bind es el paquete principal del framework que define clases abstractas e interfaces que son usadas directamente con clases contenido. Define las clases Unmarshaller, Validator, y Marshaller, los cuales son objetos auxiliares para proveer sus operaciones respectivas. Adems, define una herencia de eventos de validacin y clases de excepciones para usar cuando ocurren errores de organizacin o desorganizacin.

10

Las tres funciones principales provedas por este paquete son organizacin, desorganizacin, y validacin. Define tambin la clase JAXBContent la cual es el punto de entrada para una aplicacin java dentro del marco de JAXB. La clase JAXBContext provee una abstraccin para administrar la informacin de vinculacin XML/JAVA necesaria para implementar las operaciones de desorganizar, organizar y validar. Una aplicacin cliente obtiene nuevas instancias de esta clase por el uso del mtodo newInstance(contextPath); por ejemplo:
JAXBContext jc= JAXBContext.newInstance(com.acme.foo:com.acme.bar);

El parmetro contexPath contiene una lista de los nombres de paquetes java que contienen las interfaces derivadas de un esquemaparticularmente las interfaces generadas por el compilador enlazante JAXB. El valor de este parmetro inicializa el objeto JAXBContext para permitir la manipulacin de las interfaces derivadas del esquema. Para este termino, la implementacin proveedora de JAXB debe suministrar una clase implementacin conteniendo un mtodo con la siguiente declaracin:
Public static JAXBContext createContext(String contextPath, ClassLoader classLoader) Throws JAXBException;

1.5.1.1 Desorganizacin La clase Unmarshaller en el paquete javax.xml.bind suministra a la aplicacin cliente la habilidad para convertir datos XML en un rbol de contenido de objetos Java. El mtodo unmarshal para un esquema (dentro de un nombre de espacios) permite para cualquier elemento global XML declarado en el esquema para ser desorganizado como la raz de un documento instancia. Una aplicacin cliente es capaz de desorganizar documentos XML que son instancias de cualquiera de los esquemas listados en la ContextPath; por ejemplo:
JAXBContext jc = JAXBContext.newInstance("com.acme.foo:com.acme.bar"); Unmarshaller u = jc.createUnmarshaller(); FooObject fooObj =(FooObject)u.unmarshal( new File( "foo.xml" )); // ok BarObject barObj =(BarObject)u.unmarshal( new File( "bar.xml" )); // ok

11

BazObject bazObj =(BazObject)u.unmarshal( new File( "baz.xml" )); // error, "com.acme.baz" not in contextPath

Una aplicacin cliente puede tambin generar rboles de contenido explcitamente en lugar de desorganizar datos XML existentes.
ObjectFactory objFactory = new ObjectFactory(); com.acme.foo.PurchaseOrder po = objFactory.createPurchaseOrder();

Una vez que la aplicacin cliente tiene una instancia de un objeto derivado del esquema, este puede usar los mtodos el transformador de mtodos para establecer contenido en este punto 1.5.1.2 La Organizacin La clase Marchaller dentro del paquete jabax.xml.bind provee a la aplicacin cliente la habilidad para convertir una rbol de contenido java de regreso a datos XML. No hay diferencia entre organizar un rbol de contenido que es creado manualmente usando los mtodos de fbrica y organizar a un rbol de contenido que es el resultado de una operacin de desorganizacin. El proceso de organizacin puede alternativamente producir flujos de eventos SAX2 para un registrado ContentHandler o producir un Nodo objeto DOM. Un simple ejemplo que desorganiza un documento xml y luego lo organiza de regreso fuera es como sigue
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" ); // unmarshal from foo.xml Unmarshaller u = jc.createUnmarshaller(); FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // marshal to System.out Marshaller m = jc.createMarshaller(); m.marshal( fooObj, System.out );

1.5.1.3 La Validacin

12

La clase Validador en el paquete javax.xml.bind es responsable del control de la validacin del rbol contenido durante el tiempo de ejecucin. Cuando el proceso de desorganizacin incorpora validacin y esta fue completada exitosamente sin algn error de validacin, ambos el documento de entrada y el rbol de contenido resultante estn garantizados de ser validos. Por el contrario, el proceso de organizacin en realidad no realiza validacin. En general, si una implementacin JAXB no puede inequvocamente completar la desorganizacin u organizacin, esta terminara el procesamiento con una excepcin. Un cliente JAXB pude realizar dos tipos de validacin: Validacin al tiempo de desorganizar permite a una aplicacin cliente recibir informacin acerca de los errores y advertencias detectadas durante la desorganizacin de datos XML dentro de un rbol de contenido, y es completamente ortogonal a los otros tipos de validacin. Para habilitar o deshabilitar esto usa el mtodo Unmarshaller.setValidating. Todos los proveedores JAXB son requeridos para soportar esta operacin. Validacin por demanda permite a una aplicacin cliente recibir informacin acerca de errores de validacin y advertencias detectadas en el rbol de contenido. A cualquier punto, las aplicaciones cliente pueden llamar al mtodo Validator.validate en el rbol de contenido (o cualquier subrbol de este). Todos los proveedores estn obligados a soportar esta operacin

1.6 Versiones
Como es natural, JAXB ha tenido hasta la fecha varias versiones, que corresponden a caractersticas o soportes nuevos entre cada versin. El lenguaje de esquema W3C no es el nico lenguaje de esquema, sino que es el nico al que se ha hecho referencia aqu. Sin embargo, la especificacin XML describe DTD como la forma de expresar un esquema. Versiones preliberadas de implementaciones JAXB solo trabajaban con DTDs. Sin embargo en la actualidad, en las ltimas versiones de JAXB, se da soporte

13

tambin al esquema XML. El esquema XML permite mayores potencialidades que los DTD como se ver un poco mas adelante.

Parte II. DOCUMENTOS XML


2.1 Qu es XML?
XML, sigla en ingls de eXtensible Markup Language (Lenguaje de Marcas Extensible), es un metalenguaje extensible de etiquetas desarrollado por el World Wide Web Consortium (W3C). XML es clasificado como un lenguaje extensible debido a que permite a sus usuarios definir sus propias etiquetas. Es una simplificacin y adaptacin del lenguaje SGML y permite definir la gramtica de lenguajes especficos (de la misma manera que HTML es a su vez un lenguaje definido por SGML). Por lo tanto XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes necesidades. Algunos de estos lenguajes que usan XML para su definicin son XHTML, SVG, MathML. XML no ha nacido slo para su aplicacin en Internet, sino que se propone como un estndar para el intercambio de informacin estructurada entre diferentes plataformas. Se puede usar en bases de datos, editores de texto, hojas de clculo y casi cualquier cosa imaginable. XML es una tecnologa sencilla que tiene a su alrededor otras que la complementan y la hacen mucho ms grande y con unas posibilidades mucho mayores. Tiene un papel muy importante en la actualidad ya que permite la compatibilidad entre sistemas para compartir la informacin de una manera segura, fiable y fcil. XML fue desarrollado por el Grupo de Trabajo XML (XML Working Group), originalmente conocido como SMGL Editorial Review Borrad), formado bajo el auspicio de la W3C en 1996.

14

Las metas diseadas para XML son: XML debe buscar la usabilidad sobre Internet. XML debe soportar una amplia variedad de aplicaciones. XML debe ser compatible con SGML. Debe ser fcil escribir programas que procesen documentos XML. El nmero de caractersticas opcionales en XML debe mantenerse al mnimo absoluto, idealmente ninguno. Los documentos XML deben ser legibles para personas y ser razonablemente claros. El diseo XML debe ser preparado rpidamente. El diseo de XML debe ser formal y conciso. Los documentos XML deben ser fciles de crear. La brevedad en el etiquetado XML es de mnima importancia.

2.2 Definicin de Tipo de Documento (DTD)


Un DTD modela un documento: Definiendo un conjunto de elementos que pueden aparecer en un documento XML. Definiendo el modelo del contenido de cada elemento. Un modelo del contenido describe lo que un elemento puede contener en trminos de cualquier subelementos y datos. Definiendo un conjunto de atributos opcionales u obligatorios para cada elemento. La definicin de atributos incluye el nombre del atributo, el valor por defecto y el tipo de dato.

Como el resto de un documento XML, un DTD es simplemente una seccin especial de texto. Sin embargo, debe aparecer al principio de un documento XML para que una aplicacin que reconozca XML pueda validar el documento. Un DTD puede ser externo o interno a un documento XML. Un documento DTD externo reside en otro archivo, a veces en otra computadora. Un DTD interno reside en el mismo archivo que el documento XML. Esto es
15

conocido algunas veces como DTD privado porque define el modelo de datos que un documento XML especfico utiliza. En contraste, un DTD externo usualmente define un modelo de datos para un conjunto de documentos XML relacionados. Como resultado, un DTD externo a veces es referido como DTD pblico o compartido. Ya sea interno o externo, un DTD siempre aparece al inicio de un documento XML, inmediatamente despus de la declaracin de XML.

2.2.1 Declaracin de Tipo de Documento


Un DTD inicia con la declaracin del tipo de documento, que contiene una referencia a un DTD externo o declara un DTD interno.

La declaracin de tipo de documento inicia con <!DOCTYPE, que debe estar todo en maysculas como se muestra en nmero 1. Si planea declarar un DTD interno, debe proveer el nombre del elemento raz como se muestra en el nmero 2. Como se mencion previamente, un DTD externo a veces es llamado como pblico o compartido porque reside en un archivo separado. Sin embargo, puede declarar un DTD externo como privado usando la declaracin del nmero 3. Puede declarar un DTD compartido y pblicamente accesible usando la sintaxis mostrada en el nmero 4. El nmero 5 representa una declaracin DTD interna (lo de declaration no es parte del DTD). Este tipo de declaracin es para el uso exclusivo del documento XML en el que la declaracin aparece. DTDs internos son
16

convenientes porque son fciles de mantener y transportar, pero no son considerados para ser reutilizables. Aqu hay algunos ejemplos de varias declaraciones de tipo de documento.
<!DOCTYPE people> <!DOCTYPE people SYSTEM /people.dtd> <!DOCTYPE book PUBLIC -//OASIS//DTD DocBook XML V4.1.2//EN http://www.oasis.open.org/docbook/xml/4.0/docbook.dtd> <!DOCTYPE employees SYSTEM employees.dtd []>

2.2.2 Declaracin de Elementos

La declaracin de un elemento inicia con el delimitador <! (nmero 1 en la figura) inmediatamente seguido por ELEMENT en maysculas (nmero 2 en la figura). El nombre del elemento (nmero 3) especifica qu nombre tendr el elemento. El modelo de contenido (nmero 4) le permite declarar los cuatro tipos de elementos que puede crear usando XML: Elementos vacos (no contienen datos) Elementos con slo elementos (contiene solamente otros elementos) Elementos mezclados (contiene texto y otros elementos) Elementos any (pueden contener cualquier contenido permitido)

2.2.2.1 Elementos vacos

17

Los elementos vacos no contienen ningn contenido y tpicamente usan atributos para llevar datos e informacin. El siguiente ejemplo declara un elemento vaco:
<!ELEMENT lineBreak EMPTY>

As es como el elemento previo puede aparecer como parte de un documento XML:


<lineBreak/> <!versin corta 1 --> <lineBreak /> <!-- versin corta 2 --> <lineBreak></lineBreak> <!-- versin larga -->

Esto muestra dos notaciones abreviadas. Ambas usan la secuencia de caracteres />, pero la diferencia es el espacio entre el nombre del elemento y la secuencia de caracteres de cierre. La versin larga no es deseable a comparacin de las dos primeras formas. Las primeras dos dejan ms claro que el elemento est vaco mientras que la versin larga no. 2.2.2.2 Elementos con slo elementos Elementos con slo elementos no contienen datos pero contienen otros elementos. La declaracin de un elemento con slo elemento describe el nombre del elemento junto con el contenido que puede contener. La forma general de la declaracin de un elemento con slo elementos es
<!ELEMENT nombre contenido>

El nombre representa el nombre del elemento como aparece en el documento XML, y el contenido representa lo que el elemento puede contener. Una declaracin de slo elementos puede contener Una lista ordenada de elementos Un elemento de una lista de elementos vlidos Un conjunto repetido de elementos Una mezcla de todas las anteriores

La lista ordenada de elementos es la ms sencilla de entender de los tres tipos de contenidos. Asumiendo que est modelando un documento XML que contiene informacin acerca de algunos libros, y quiere asegurarse de que
18

contenga informacin bsica acerca de cada libro, como la editorial, fecha de publicacin, ISBN, ttulo, subttulo, autor y un comentario, en ese orden. Puede expresar una lista ordenada de elementos usando la siguiente sintaxis:
<!ELEMENT nombreElemento(elemento1,elemento2,elemento3,...,elementoN)>

La declaracin especifica el nombre del elemento, el cul contiene los subelementos ordenados. Las comas indican que el listado es una lista ordenada. Como resultado, los subelementos deben aparecer en el orden especificado en el listado entre parntesis. Con el ejemplo de los libros quedara as:
<!DOCTYPE libros [ <!ELEMENT libros (libro)> <!ELEMENT libro (editorial, fechaLanzamiento, isbn, titulo, subtitulo, autor, comentario)> ]>

No muestra el DTD completo, porque lo que ve aqu est incompleto porque el DTD no especifica qu contenido tienen los elementos autor, isbn y los otros. Asumiendo que los subelementos no contienen ningn dato (son elementos vacos), el DTD completo se ver como esto:
<!ELEMENT libros (editorial, fechaLanzamiento, isbn, titulo, subtitulo, autor, comentario)> <!ELEMENT editorial EMPTY> <!ELEMENT fechaLanzamiento EMPTY> <!ELEMENT isbn EMPTY> <!ELEMENT titulo EMPTY> <!ELEMENT subtitulo EMPTY> <!ELEMENT autor EMPTY> <!ELEMENT comentario EMPTY>

El siguiente documento sera vlido usando el DTD previo:


<?xml version=1.0?> <libros> <editorial/> <fechaLanzamiento/> <isbn/> <titulo/> <subtitulo/>

19

<autor/> <comentario/> </libros>

Si quiere incluir el DTD junto con el documento XML, quedara as:


<?xml version=1.0?> <!DOCTYPE libros [ <!ELEMENT libros (editorial, fechaLanzamiento, isbn, titulo, subtitulo, autor, comentario)> <!ELEMENT editorial EMPTY> <!ELEMENT fechaLanzamiento EMPTY> <!ELEMENT isbn EMPTY> <!ELEMENT titulo EMPTY> <!ELEMENT subtitulo EMPTY> <!ELEMENT autor EMPTY> <!ELEMENT comentario EMPTY> ]> <libros> <editorial/> <fechaLanzamiento/> <isbn/> <titulo/> <subtitulo/> <autor/> <comentario/> </libros>

En contraste con una lista ordenada de elementos, una seleccin de elemento lista una serie de elementos que un elemento puede contener. Sin embargo, el elemento puede contener slo uno de los elementos en la lista. Supongamos que est modelando un documento de inventario que contiene el precio de venta y el precio de compra, pero no quiere que los dos precios aparezcan para un tem dado. Quiere que aparezca un precio, pero slo el precio de venta o el precio de compra. El siguiente DTD modela el documento del inventario:
<!ELEMENT tems (item+)> <!ELEMENT item (precioVenta | precioCompra)> <!ELEMENT precioVenta EMPTY> <!ELEMENT precioCompra EMPTY>

Si queremos incluir el DTD al inicio del documento XML, debemos ponerlo con la declaracin DOCTYPE:
<?xml version=1.0?> <!DOCTYPE tems [
20

<!ELEMENT items (item+)> <!ELEMENT item (precioVenta | precioCompra)> <!ELEMENT precioVenta EMPTY> <!ELEMENT precioCompra EMPTY> ]> <items> <item> <precioVenta/> </item> <item> <precioCompra/> </item> <item> <precioVenta/> </item> </items>

Esto introduce un conjunto de elementos repetidos. Aqu hay un vistazo ms cercano del elemento que lo declara:
<!ELEMENT tems (item+)>

La declaracin del elemento se ve muy similar a una lista ordenada que contiene slo un elemento, excepto que un signo ms sigue a la palabra item. Esto indica que el nombre del elemento que lo precede debe aparecer al menos una vez y puede aparecer cualquier nmero de veces. Puede usar varios smbolos para restringir el nmero de veces que los subelementos pueden aparecer, como se muestra en la siguiente tabla: Tabla de smbolos en declaraciones de elementos
(sin (sin smbolo) smbolo) ? Signo de interrogacin * Asterisco + Smbolo ms () Parntesis | Pipe , Coma Indica que el elemento debe aparecer exactamente una sola vez. Indica que el elemento es opcional, puede aparecer una vez o ninguna. Indica que el elemento puede aparecer cero o ms veces. Indica que un elemento puede aparecer una o ms veces. Agrupa una lista de secuencia o de eleccin. Usado como parte de una lista de opciones, puede seleccionar un tem de la lista. Usada como parte de una secuencia, puede usar los elementos en la secuencia basado en sus restricciones individuales.

21

Estos smbolos pueden ser tiles para que el DTD sea ms complejo. Por ejemplo, los libros usualmente tienen una dedicatoria, prefacio, tabla de contenidos y uno o ms captulos. Cada captulo en un libro tiene al menos un encabezado y un prrafo, el cul puede contener texto, una figura, una tabla o una lista. En lugar de imponer esta estructura, puede agregar flexibilidad usando la siguiente declaracin:
<!ELEMENT libro ((dedicatoria?), prefacio, tdc, (capitulo+))> <!ELEMENT capitulo (encabezado, (parrafo+))> <!ELEMENT parrafo (#PCDATA | figura | tabla | lista)*>

Este fragmento de DTD indica que la dedicatoria es opcional, indicado por el smbolo , pero que debe haber un prefacio, una tabla de contenidos (tdc), y al menos un captulo. Cada captulo tiene un encabezado y uno o ms prrafos que pueden contener texto (#PCDATA), una figura, una tabla o una lista. Notemos que el elemento prrafo, adems de los subelementos que contiene, tambin contiene texto. Este tipo de elemento es referido como elemento de contenido mixto. 2.2.2.3 Elementos de Contenido Mixto Un elemento mixto puede contener datos y elementos. Este modelo es una extensin de los elementos que contienen slo elementos que tambin permite datos de texto. El siguiente cdigo declara algunos elementos mixtos:
<!DOCTYPE paises [ <!ELEMENT paises (pais)> <!ELEMENT pais (#PCDATA | ubicacion | poblacion)> <!ELEMENT poblacion (#PCDATA | unidades)> <!ELEMENT ubicacion (#PCDATA | region | #PCDATA)> <!ELEMENT comentario (#PCDATA)> ]>

Esto declara un documento que contiene una coleccin de pases. Cada pas est hecho de texto (#PCDATA), y elementos de ubicacin y poblacin. #PCDATA puede aparecer ms de una vez en la declaracin de un elemento, como se mostr en el elemento ubicacin. Puede declarar un elemento de slo texto usando la forma mostrada en el elemento comentario.

22

2.2.2.4 Elementos ANY Un elemento ANY puede contener cualquier contenido. Declare el elemento as:
<!ELEMENT nombre ANY>

El elemento ANY no tiene ninguna estructura. Como resultado, debe evitar usarlo en sus propios DTDs. Su principal rol es actuar como comodn hasta que decida qu tipo de elemento debe contener.

2.2.3 Declaracin de Atributos


Los atributos permiten aadir informacin adicional a los elementos de un documento. La principal diferencia entre los elementos y los atributos, es que los atributos no pueden contener subatributos. Se usan para aadir informacin corta, sencilla y desestructurada.
<mensaje prioridad="urgente"> <de>Alfredo Reino</de> <a>Hans van Parijs</a> <texto idioma="holands"> Hallo Hans, hoe gaat het? ... </texto> </mensaje>

Otra diferencia entre los atributos y los elementos, es que cada uno de los atributos slo se puede especificar una vez, y en cualquier orden. En el ejemplo anterior, para declarar la lista de atributo de los elementos <mensaje> y <texto> haramos lo siguiente:
<!ELEMENT mensaje (de, a, texto)> <!ATTLIST mensaje prioridad (normal | urgente) normal> <!ELEMENT texto (#PCDATA)> <!ATTLIST texto idioma CDATA #REQUIRED>

Las declaraciones de los atributos empiezan con "<!ATTLIST", y a continuacin del espacio en blanco viene el identificador del elemento al que se aplica el atributo. Despus viene el nombre del atributo, su tipo y su valor por defecto. En el ejemplo anterior, el atributo "prioridad" puede estar en el
23

elemento <mensaje> y puede tener el valor "normal" o "urgente", siendo "normal" el valor por defecto si no especificamos el atributo. El atributo "idioma", pertenece al atributo texto, y puede contener datos de carcter CDATA. Es ms, la palabra #REQUIRED significa que no tiene valor por defecto, ya que es obligatoria especificar este atributo. A menudo interesa que se pueda omitir un atributo, sin que se adopte automticamente un valor por defecto. Para esto se usa la condicin "#IMPLIED". Por ejemplo, en una supuesta DTD que define la etiqueta <IMG> de HTML:
<!ATTLIST IMG URL CDATA #REQUIRED> <!ALT CDATE #IMPLIED>

Es decir, el atributo "URL" es obligatorio, mientras que el "ALT" es opcional (y si se omite, no toma ningn elemento por defecto). 2.2.3.1 Atributos CDATA y NMTOKEN Los atributos CDATA (Character DATA) son los ms sencillos, y pueden contener casi cualquier cosa. Los atributos NMTOKEN (NaMe TOKEN) son parecidos, pero slo aceptan los caracteres vlidos para nombrar cosas (letras, nmeros, puntos, guiones, subrayados y los dos puntos).
<!ATTLIST mensaje fecha CDATA #REQUIRED> <mensaje fecha="15 de Diciembre de 1999"> <!ATTLIST mensaje fecha NMTOKEN #REQUIRED> <mensaje fecha="15-12-1999">

2.2.3.2 Atributos enumerados y notaciones Los atributos enumerados son aquellos que slo pueden contener un valor de entre un nmero reducido de opciones.
<!ATTLIST mensaje prioridad (normal | urgente) normal>

24

Existe otro tipo de atributo parecido, llamado de notacin (NOTATION). Este tipo de atributo permite al autor declarar que su valor se ajusta a una notacin declarada.
<!ATTLIST mensaje fecha NOTATION (ISO-DATE | EUROPEAN-DATE) #REQUIRED>

Para declarar las notaciones, se utiliza "<!NOTATION" con una definicin externa de la notacin. La definicin externa puede ser pblica o un identificador del sistema para la documentacin de la notacin, una especificacin formal o un asistente de la aplicacin que contenga objetos representados en la notacin
<!NOTATION HTML SYSTEM "http://www.w3.org/Markup"> <!NOTATION HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.2.3.3 Atributos ID e IDREF El tipo ID permite que un tipo determinado tenga un nombre nico que podr ser referenciado por un atributo de otro elemento que sea de tipo IDREF. Por ejemplo, para implementar un sencillo sistema de hipervnculos en un documento:
<!ELEMENT enlace EMPTY> <!ATTLIST enlace destino IDREF #REQUIRED> <!ELEMENT capitulo (parrafo)*> <!ATTLIST capitulo referencia ID #IMPLIED>

En este caso, una etiqueta <enlace destino="seccion-3"> hara referencia a un <capitulo referencia="seccion-3">, de forma que el procesador XML lo podra convertir en un hipervnculo, u otra cosa.

2.3 XML Schema


XML Schema es un lenguaje de esquema escrito en XML, basado en la gramtica y pensado para proporcionar una mayor potencia expresiva que la DTD, ms limitado en la descripcin de los documentos a nivel formal.

25

Los documentos esquema (usualmente con extensin .xsd de XML Schema Definition (XSD)) se concibieron como una alternativa a las DTD, ms compleja, intentando superar sus puntos dbiles y buscar nuevas capacidades a la hora de definir estructuras para documentos XML. La principal aportacin de XML Schema es el gran nmero de los tipos de datos que incorpora. De esta manera, XML Schema aumenta las posibilidades y funcionalidades de aplicaciones de procesado de datos, incluyendo tipos de datos complejos como fechas, nmeros y strings. "XML Schema" (Esquema XML) es el nombre oficial otorgado a la recomendacin del W3C, que elabor el primer lenguaje de esquema separado de XML (la definicin de tipo de documentos (DTD) forma parte de XML). XML Schema supera muchas de las limitaciones y debilidades de las DTDs. Fue diseado completamente alrededor de namespaces y soporta tipos de datos tpicos de los lenguajes de programacin, como tambin tipos personalizados simples y complejos. Un esquema se define pensando en su uso final. Los esquemas se construyen a partir de diferentes tipos de componentes: Elemento (element) Atributo (attribute) Tipo simple (simple type) Tipo complejo (complex type) Notacin (notation) Grupo modelo nombrado (named model group) Grupo de atributos (attribute group) Restriccin identidad (identity constraint)

Estos componentes ofrecen la posibilidad de combinar caractersticas de alto o bajo nivel: Alto nivel: Se encargan de ofrecer un significado semntico del contenido del documento. Analizan el contenido y extraen de l un significado. ste puede estar predefinido en la declaracin del esquema o se puede extraer de la misma estructura. Bajo nivel: Son caractersticas ms concretas del documento que estn incluidos en los diferentes campos del esquema y se accede a ellas de
26

manera directa. Son los que se comparan directamente con el criterio de bsqueda definido y halla palabras concretas en la definicin de los esquemas.

2.3.1 Estructura Mnima de un Esquema


<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="0.1" xml:lang="es"> </xsd:schema>

La programacin en Schema XML se basa en Namespaces. Podemos encontrar una analoga entre stos y los llamados packages en Java. Cada Namespace contiene elementos y atributos que estn estrechamente relacionados con el Namespace. As, a la hora de definir un elemento o un atributo de un Namespace, siempre se crear una conexin entre los diferentes campos de ste. Adems, esta forma de trabajar nos permite relacionar elementos que no estn en el mismo Namespace. Despus de escribir un Schema XML se puede confirmar la correcta realizacin mediante la validacin de esquemas XML: Validacin XML.

2.3.2 Tipos de Datos


Los tipos de datos en XML Schema pueden ser simples o complejos: Tipos simples: son aquellos que no tienen ni elementos hijos ni atributos. Son tipos simples: Tipos predefinidos de XML: string, double, boolean, etc. List (lista de datos separados por espacios). Union (tipo de dato derivado de la unin de tipos predefinidos).

Tipos complejos: Son tipos complejos aquellos que tienen elementos hijos y/o atributos. Pueden tener nombre o ser annimos. Si tienen nombre pueden ser reutilizados dentro del mismo XML Schema o por otros XML Schemas. Es posible "mezclar" o combinar elementos y texto.

27

2.3.3 Diagrama de los Tipos de Datos que manejan los Schemas

2.4 Documento XML


Suponiendo que tuvieramos un documento xml de esta forma:
<?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

Para hacer referencia a un dtd escribimos:


<?xml version="1.0"?> <!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd"> <note> <to>Tove</to> <from>Jani</from>
28

<heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

Mientras que para hacer referencia a un schema escribimos:


<?xml version="1.0"?> <note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

2.4.1 Ejemplo: Diferencias entre DTD y Schemas


Utilizando el documento xml anterior, podriamos definir sus elementos con un DTD de esta manera:
<!ELEMENT note (to, from, heading, body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>

Utilizando un schema nos quedaria de esta forma:


<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType>
29

</xs:element> </xs:schema>

30

Parte III. ACCESO A UN DOCUMENTO XML


3.1 Construccin de una aplicacin JAXB
Antes de construir una aplicacin JAXB primeramente necesitamos tener un esquema XML. En la versin 1.0 de JAXB, se requiere que el esquema utilizado sea un DTD, segn lo establecido en la especificacin XML 1.0. No obstante en las versiones posteriores a la 1.0, podemos utilizar el Schema XML. Despus de tener el Schema o DTD, seguimos los siguientes pasos para poder construir y usar nuestra aplicacin JAXB. 1. Escribir el esquema de Unin: es un documento XML que contiene instrucciones de cmo unir un esquema a las clases. Estas indicaciones pueden ser por ejemplo, el tipo primitivo al que se debe unir un valor de atributo en la clase generada. 2. Generar los ficheros fuente de Java: para esto usamos el compilador de esquema, ya que este toma al schema o DTD y al esquema de unin como entrada de informacin. Cuando ya se haya compilado el cdigo fuente, podemos escribir una aplicacin basada en las clases que resulten. 3. Construir el rbol de objetos Java: con nuestra aplicacin, construimos el rbol de objetos java, tambin llamado rbol de contenido, este representara los datos XML que son validos con el schema o DTD. Hay 2 maneras de hacer esto:
Ejemplarizando las clases generadas. Invocando al mtodo unmarshal de una clase generada y pasarlo

en el documento. El Mtodo unmarshal toma un documento XML vlido y construye una representacin de rbol de objetos. 4. Acceder al rbol de contenido usando nuestra aplicacin: con nuestra aplicacin podemos acceder al rbol de contenido y modificar sus datos.

31

5. Generar un documento XML desde el rbol de contenido: para poder hacerlo tenemos que invocar al mtodo marshal sobre el objeto raz del rbol.

3.2 Creacin del Esquema de Unin


Para unir un schema o DTD a las clases, utilizamos el lenguaje de unin y el compilador de esquema, ambos incluidos con JAXB. El lenguaje de unin es un lenguaje basado en XML que utilizamos para escribir al esquema de unin. El esquema de unin contiene las instrucciones para unir el DTD a las clases, y lo utilizamos para controlar el cdigo que genera el compilador de esquema. Por esto es importante comprender como interpreta el compilador de esquema a las declaraciones que hacemos en el esquema de unin y lo que asume dicho compilador si no proporcionamos declaraciones de unin para una declaracin del schema o DTD. Al escribir el esquema de unin, no es necesario que proporcionemos declaraciones particulares de unin para cada uno de los componentes del schema o DTD, ya que cuando las omitimos, el compilador de esquema asume declaraciones de uniones por defecto. Sin embargo, si no nos satisfacen las uniones por defecto, podemos escribir en el esquema de unin las declaraciones de unin que necesitamos para generar las clases deseadas. Por ejemplo, el compilador de esquema utiliza un algoritmo general de mapeo de nombres para unir nombres XML a nombres que son aceptables en el lenguaje de programacin Java. En este caso, podemos utilizar el esquema de unin para hacer que el compilador de esquema genere nombres diferentes. Para crear el esquema de unin mnimo requerido seguimos los siguientes pasos: 1. Creamos un nuevo archivo de texto con extensin .xjs. 2. Para identificar al archivo como un esquema de unin, escribimos la etiqueta:
<xml-java-binding-schema version=1.0ea>

3. Los esquemas de unin deben declarar al menos un elemento raz. Para declararlo escribimos:

32

<element name=nombre_elemento_raiz type=class root=true/>

Al declarar los elementos raz, utilizamos la declaracin de unin del elemento para unir un tipo de elemento a una clase. El valor del atributo name, debe ser el nombre del elemento tal como aparece en el schema o DTD. El valor del tipo de atributo class indica que los elementos raz se limitan a las clases. Finalmente el valor del atributo root debe ser igual a true para que en la estructura de los documentos XML podamos declarar como elementos raz al elemento o elementos que declaramos como tal en el esquema de unin. 4. Introducimos la etiqueta de cierre para el elemento xml-java-bindingschema :
</xml-java-binding-schema>

Ahora ya tenemos el esquema de unin desde el cual el compilador de esquema puede generar clases. Recordemos que el compilador de esquema har declaraciones de uniones por defecto, para las otras declaraciones del schema o DTD a las que no les hayamos proporcionado una declaracin de unin.

3.2.1 Declaracin de Unin de Elementos


El compilador de esquema asume las diversas declaraciones de unin para los elementos dependiendo del tipo de contenido que tienen y sus atributos si es que los hay. Para los elementos simples, es decir, los que no tienen atributos y solo tienen contenido de tipo carcter, el compilador de esquema asumir que los elementos estn unidos a las propiedades dentro de la clase de su elemento padre. Para esto el compilador generara el siguiente cdigo de declaracin de unin por defecto:
<element name=nombre_elemento_simple type=value/>

El nombre de los atributos debe ser el nombre del elemento tal y como aparece en el schema o DTD. El tipo del atributo es value porque estos elementos estn unidos a propiedades y no a clases. Las propiedades que generar el compilador de esquema con estas declaraciones de unin sern:
String getNombre_elemento_simple(); void setNombre_elemento_simple(String x);

33

Si los elementos contienen cualquier cosa distinta de contenido de tipo carcter o si tienen atributos, el compilador de esquema asumir que estn unidos a clases. Por lo que las uniones por defecto de estos elementos sern:
<element name=nombre_elemento type=class>

Podemos observar que en esta declaracin no se especifica el atributo root como lo hicimos en la seccin 3.2 Creacin del esquema de Unin, esto es debido a que el compilador de esquema asume que el valor de este atributo es false. Por lo que solo necesitamos especificar el valor de este atributo como true cuando queramos que dicho elemento pueda ser usado como elemento raz. Los elementos con contenido EMPTY tambin estarn unidos a clases, y su declaracin de unin por defecto ser:
<element name=nombre_elemento_vacio type=class/>

A menos que lo especifiquemos de otra manera en nuestro esquema de unin, el compilador de esquema generar una clase para cada elemento cuyo contenido contenga otros elementos. De la declaracin de unin de los elementos que tienen elementos como contenido y/o atributos, el compilador de esquema generar la siguiente definicin de clase y constructor:
public class Nombre_elemento extends MarshallableObject { public void Nombre_elemento();

3.2.2 Declaracin de Unin de Atributos


En los elementos que tienen atributos, dichos atributos toman valores atmicos en vez de valores compuestos, por lo que el compilador de esquema asume que estn unidos a propiedades String, como se especifica en la siguiente declaracin por defecto:
<element name=nombre_elemento type=class> <attribute name=nombre_atributo/>

34

Dentro de la definicin de clase del elemento, el compilador de esquema generar la siguiente propiedad para representar al atributo:
void setNombre_atributo(String x); String getNombre_atributo();

Podemos observar en esta propiedad, que se acepta y devuelve un String, ms adelante en la seccin 3.2.5 Especificando Tipos veremos como modificar el esquema para requisitos de uniones particulares de manera que el compilador de esquema genere una propiedad que acepte y devuelva otros tipos de datos. As como tambin veremos en la seccin 3.2.6 Creacin de Tipos de Datos Enumerados, como generar tipos de datos enumerados para la propiedad que representa al atributo.

3.2.3 Declaracin de Unin de Contenido


La declaracin de unin de contenido es lo ms complicado, debido a que hay infinitas maneras de especificar el contenido XML, sin embargo JAXB nos lo facilita. El tipo ms comn de modelo de contenido es una secuencia simple no repetitiva por ejemplo: (a, b, c, d). si utilizamos este modelo de contenido, es muy probable que no tengamos que especificar una declaracin de unin para l, ya que el compilador de esquema generar una propiedad separada para cada elemento de la secuencia. Por lo que para los elementos con contenido secuencial simple y no repetitivo (ya sea la raz u otro elemento), el compilador de esquema asumir las siguientes declaraciones de unin mostradas en negritas:
<element name=nombre_elemento_raz type=class root=true> <content> <element-ref name=nombre_elemento1/> <element-ref name=nombre_elemento2/> </content> </element> <element name=nombre_elemento type=class> <attribute name=nombre_atributo/> <content> <element-ref name=nombre_elemento1/> <element-ref name=nombre_elemento2/> </content> </element>

La declaracin de unin element-ref se utiliza para unir un ejemplar de un elemento del modelo de contenido, a una propiedad en la clase del elemento
35

padre. Por defecto, el compilador de esquema genera propiedades String desde todas las declaraciones de uniones element-ref que se refieran a elementos simples. Por lo que la propiedad generada para estos elementos ser:
public class Nombre_elemento { ... String getNombre_elemento1(); void setNombre_elemento1(String x);

Si un elemento contiene algo distinto a una secuencia simple no repetitiva, el compilador de esquema asumir la declaracin de unin de la propiedad general-content, por lo que su declaracin ser:
<element name=nombre_elemento_raz type=class root=true> <content property=content/> </element> ... <element name=nombre_elemento type=class> <attribute name=nombre_atributo/> <content property=content/> </element>

Usamos la declaracin general-content para unir un modelo de grupo completo (incluyendo modelos de grupos anidados), a una propiedad. Sin embargo, esta declaracin no es til cuando deseamos acceder a los elementos individuales del modelo de contenido. No obstante, puede ser til para definir uniones mas flexibles si anticipamos que nuestro schema o DTD cambiar en el futuro. Desde estas declaraciones de unin el compilador de esquema genera la siguiente propiedad:
List getContent(); void emptyContent(); void deleteContent();

El mtodo getContent devuelve una lista modificable que contiene el valor actual de las propiedades. El mtodo emptyContent descarta los valores de la lista y crea una nueva lista vaca. El mtodo deleteContent borra la lista. Ahora que ya entendemos las declaraciones de unin que el compilador del esquema asumir basndose en el schema o DTD y el esquema de unin
36

mnimo, podemos escribir fcilmente el esquema de unin. Lo nico que necesitamos hacer es escribir las declaraciones de uniones que no son asumidas por el compilador de esquema.

3.2.4 Ejemplo: Esquema de Unin para book.dtd.


Como un ejemplo de unir un esquema a las clases, consideremos este DTD:
<!ELEMENT book (title, author, chapter+)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT chapter (#PCDATA)>

En muchos casos, el compilador de esquema puede generar una unin apropiada incluso cuando el esquema de unin no incluye una instruccin de unin para una declaracin determinada del DTD. De hecho, para generar las clases del DTD book, todo lo que necesitamos en nuestro esquema de unin es:
<xml-java-binding-schema> <element name="book" type="class" root="true" /> </xml-java-binding-schema>

Para estos DTD y esquema de unin, el compilador de esquema genera una clase Book con este constructor y estas propiedades:
public Book(); public String getTitle(); public void setTitle(String x); public String getAuthor(); public void setAuthor(String x); public List getChapter(); public void deleteChapter(); public void emptyChapter();

Recuerda que el elemento chapter en el modelo de contenido book tena un + como indicador de ocurrencia:
<!ELEMENT book (title, author, chapter+)>

La lista que devuelve getChapter es una lista de valores String, cada uno de los cuales representa un ejemplar distinto del elemento chapter. Observa
37

tambin que el esquema de unin no hizo referencia al indicador de ocurrencia despus del ejemplar del elemento chapter. ste es un ejemplo de cmo el compilador de esquema considera las especificaciones del DTD as como las instrucciones de unin del esquema de unin al generar las clases.

3.2.5 Especificando Tipos


Por defecto, el compilador de esquema genera mtodos get que devuelven un String y mtodos set que aceptan un String, para todos los elementos y atributos simples. Por ejemplo consideremos las siguientes declaraciones de unin por defecto para el elemento amount:
<element-ref name=amount/> ... <element name=amount type=value/>

Desde estas declaraciones, el compilador de esquema generar estos dos mtodos:


public String getAmount(); public void setAmount(String amount);

En caso de que deseramos hacer clculos con la variable amount tendramos que convertirla de un String a algn otro tipo de dato que nos lo permita. Para clculos que implican valores de moneda podemos utilizar el tipo BigDecimal, ya que este tipo representa nmeros decimales con signo y precisin arbitraria. Para especificar un tipo, lo nico que tenemos que hacer es utilizar la declaracin de conversin para definir la conversin y el atributo convert de la declaracin del elemento o del atributo, dependiendo de si queremos convertir el tipo de una propiedad de elemento o de atributo, para referenciar la declaracin de conversin. 3.2.5.1 Especificar Tipos No Primitivos Para definir una conversin de String a BigDecimal debemos seguir los siguientes pasos:

38

1. Aadimos en el nivel superior de nuestro esquema de unin, entre las etiquetas <xml-java-binding-schema version=1.0ea> y despus de la declaracin de unin del elemento raz, la siguiente declaracin de conversin:
<conversion name=BigDecimal type=java.math.BigDecimal/>

Cualquier declaracin de unin de elemento o de atributo que quiera utilizar esta conversin se referir a ella por el nombre BigDecimal, segn lo especificado por el nombre del atributo. El valor del tipo de atributo es el tipo real al cual se convierte una propiedad. 2. Para decirle al compilador de esquema que genere una propiedad de un elemento con un tipo BigDecimal tenemos que: Aadir una declaracin de unin de elemento para el elemento que queramos convertir en la parte superior de nuestro esquema de unin, como ejemplo utilizaremos al elemento amount de la seccin anterior:
<element name=amount type=value />

Aadimos un atributo convert a la unin del elemento amount y le asignamos el valor BigDecimal:
<element name=amount type=value convert=BigDecimal/>

Estas declaraciones de unin producirn las siguientes firmas de mtodos:


<public java.math.BigDecimal getAmount(); public void setAmount(java.math.BigDecimal amount);

Declarar por separado la conversin de una unin de elemento nos permite reutilizar una conversin para otras uniones de elemento. Tambin podemos convertir el tipo de la propiedad de un elemento llamado date a un java.util.Date. Como una fecha puede escribirse de diferentes maneras, debemos especificar como se debe de analizar la fecha cuando se desempaquete y como se debe imprimir cuando se empaquete. Para hacer esta declaracin de conversin se requieren los atributos parse y print.

39

Para convertir el elemento date a un java.util.Date, seguimos los siguientes pasos: 1. Aadimos la siguiente declaracin de conversin al esquema de unin:
<conversin name=TransDate type=java.util.Date parse= TransDate.parseDate print=TransDate.printDate/>

El nombre TransDate se refiere a una clase Java que necesitamos proporcionar. Esta clase contiene un mtodo esttico parseDate que especifica cmo analizar la fecha y un mtodo esttico printDate que especifica cmo imprimir la fecha. 2. Para decirle al compilador de esquema que genere una propiedad date con la clase TransDate, aadimos un atributo convert a la declaracin de unin del elemento date y le asignamos el valor de TransDate:
<element name=date type=value convert=TransDate/>

Estas declaraciones de unin producirn las siguientes firmas de mtodos:


public java.util.Date getDate(); public void setDate(java.util.Date x);

En la conversin a BigDecimal, no necesitamos especificar un mtodo de anlisis o de impresin ya que la clase java.math.BigDecimal especifica un constructor que acepta un String y devuelve un BigDecimal y un mtodo toString que acepta un BigDecimal y devuelve un String. Para aplicar la conversin, el compilador de esquema genera cdigo para invocar al constructor y al mtodo toString. 3.2.5.2 Especificar Tipos Primitivos Para especificar tipos primitivos, como int, no necesitamos proporcionar una declaracin de unin de conversin separada, simplemente aadimos el atributo convert a la declaracin de unin del elemento o del atributo y asignamos el valor al tipo primitivo. Por ejemplo, dentro de la declaracin de unin de un elemento llamado check, aadimos una declaracin de unin de atributo para el atributo number y especificamos un tipo int para su propiedad:
40

<element name=check type=class > <attribute name=number convert=int /> </element>

3.2.6 Creacin de Tipos de Datos Enumerados


Tambin podemos utilizar al atributo convert para especificar un tipo de dato enumerado. En el lenguaje de programacin Java, representamos tipos enumerados con un tipo seguro enum, que es una clase cuyos elementos representan un conjunto fijo de valores. Un atributo cuyo valor slo se pueda fijar a uno de un conjunto fijo de valores es un buen candidato para un tipo enumerado. Para generar los tipos para estos atributos tenemos que: 1. Introducir una etiqueta enumeration para cada conversin que queramos realizar, en el nivel superior del esquema de unin, despus de la declaracin de conversin de TransDate, esto quedara as:
<conversion name=TransDate ... <enumeration/>

2. Dentro de la etiqueta enumeration escribimos el atributo name este nombre debe ser nico, debido a que podran existir mas enumeraciones que estn al mismo nivel en el esquema de unin.
<enumeration name=Categorias1/> <enumeration name=Categorias2/>

Estos nombres sern los nombres de las clases para representar los tipos seguros enums. 3. Aadimos el atributo members a cada declaracin de enumeracin, y le asignamos los posibles valores de cada atributo:
<enumeration name=Categorias1 members=val1 val2 val3/> <enumeration name=Categorias2 members=val1 val2 val3/>

41

4. Aadimos las declaraciones de unin de los atributos dentro de las declaraciones de unin de los elementos y asignamos el nombre de la declaracin de enumeracin apropiada a cada atributo convert en la declaracin de unin del atributo:
<element name=elemento1 type=class> <attribute name=nombre_atributo convert=Categorias1/> ... <element name=elemento2 type=class> <attribute name=nombre_atributo convert=Categorias2/>

5. Desde la declaracin de unin del atributo del elemento2, el compilador de esquema generar la siguiente clase:
public final class Categorias2 { public final static Categorias2 VAL1; public final static Categorias2 VAL2; public final static Categorias2 VAL3; public static Categorias2 parse(String x); public String toString(); }

3.2.7 Creacin de interfaces


Cuando tenemos un grupo de clases que proporcionan funciones similares y tienen algn comportamiento y propiedades comunes, podemos utilizar un interface para capturar las semejanzas entre las clases. Para que el compilador de esquema genere un inteface lo que tenemos que hacer es: 1. En cualquier lugar del nivel ms alto de nuestro esquema de unin, quizs despus de las declaraciones de enumeracin, introducimos la siguiente declaracin de interface:
<interface name=Entry members=clase1 clase2 clase3 properties=elemento_comun_amount elemento_comun_date />

El atributo members representa todas las clases que implementan la interface. El atributo properties representa el contenido comn compartido por los miembros de la interface.

42

2. Ahora, suponiendo que los elementos clase1, clase2, clase3 ocurren en el modelo de contenido de la raz como un grupo de eleccin, necesitamos referenciar Entry desde la unin del grupo de eleccin. Previamente asignamos el nombre de la interface al atributo de la propiedad, el valor list al atributo collection y asignamos el nombre de la interface al atributo supertype:
<element name= elemento_raiz type=class class= Elemento_raiz> <content> <choice property=entries collection=list supertype=Entry/> </content> </element>

El atributo supertype indica una clase o interface declarada en el esquema de unin, que cada clase de elemento incluida en la propiedad choice implementa. 3. Estas declaraciones de unin producirn una interface llamada Entry, que incluir las propiedades elemento_comun_amount y elemento_comun_date:
public interface Entry { ... public int getElemento_comun_amount(); public void setElemento_comun_amount(int x); public Date getElemento_comun_date(); public void setElemento_comun_date(Date d);

3.3 Generacin de los Ficheros Fuente de Java


Ya que tenemos el esquema de unin, podemos ejecutar al compilador de esquema para generar un conjunto de ficheros fuente Java desde el schema o DTD basndose en las instrucciones que proporcionamos en el esquema de unin. Despus de que se generen los ficheros fuente, podemos compilarlos usando el compilador de Java como lo haramos con cualquier aplicacin Java. Para esto seguimos los siguientes pasos: 1. Ejecutamos el compilador de esquema con el archivo del schema o DTD y el esquema de unin que hemos creado:
xjc fichero.dtd fichero.xjs

43

Ahora deberamos ver los ficheros con extensin .java (fichero.java y Entry.java) en nuestro directorio actual. 2. Compilamos los ficheros fuente en clases java con:
javac *.java

Un elemento raz del schema o DTD, est unido a la clase con el mismo nombre del elemento y su firma es:
public class nombre_elemento extends MarshallableRootElement implements RootElement

Como este elemento es un elemento raz, la clase extiende MarshallableRootElement, que es la clase que representa objetos elemento raz que pueden ser empaquetados y desempaquetados, e implementa RootElement. Aunque MarshallableRootElement define mtodos marshal, que la clase del elemento raz usa por extensin, no define ningn mtodo unmarshal. Por lo que, el compilador de esquema genera estos mtodos unmarshal estticos dentro de la clase:
public static Nombre_elemento unmarshal(InputStream in) public static Nombre_elemento unmarshal(XMLScanner xs) public static Nombre_elemento unmarshal(XMLScanner xs, Dispatcher d)

Cuando desempaquetamos un documento XML, podemos invocar a unmarshal (InputStream) o a unmarshal (XMLScanner) en los que InputStream o XMLScanner representan nuestro documento XML. Aunque el desempaquetamiento realiza la validacin por nosotros, necesitamos validar despus de editar el rbol de contenido y antes de empaquetarlo en un documento XML. Para este propsito, el compilador de esquema genera estos mtodos:
public void validateThis(); public void validate();

Despus de editar una parte del rbol de contenido, podemos usar validateThis para validar el objeto editado. Antes de empaquetar el rbol de contenido a un documento XML, debemos usar validate para validar todo el rbol de contenido.
44

3.4 Configuracin de la aplicacin JAXB


Ahora antes de poder usar JAXB para construir representaciones de datos o trabajar con los datos, lo primero que necesitamos es crear una aplicacin Java que realice estas funciones. Para configurar nuestra aplicacin JAXB hacemos lo siguiente:
1. Creamos un fichero con extensin .java, ficheroapp.java. 2. Importamos los siguientes paquetes:

import java.io.*; import java.util.*; import javax.xml.bind.*; import javax.xml.marshal.*;

Estos dos ltimos paquetes son parte del marco de trabajo de unin, que define los mtodos unmarshal, marshal, y validate.
3. Declaramos la clase ficheroapp de la siguiente manera: public class ficheroapp { } 4. Inicializamos los objetos del elemento raz: public static elemento_raz obj1 = new elemento_raz (); public static elemento_raz obj2 = new elemento_raz (); 5. Finalmente dentro de la clase ficheroapp creamos nuestro mtodo main: public class ficheroapp { public static void main(String args[]) throws Exception { } }

3.5 Construccin de Representaciones de Datos

45

Las clases Java que genera el compilador de esquema implementan y extienden las clases e interfaces del marco de trabajo de unin. Este marco de trabajo es el API de tiempo de ejecucin que usan las clases generadas para soportar tres operaciones primarias: Desempaquetar: el proceso de producir un rbol de contenidos desde un documento XML. Validacin: el proceso de verificar que la representacin de objetos Java est conforme a las reglas especificadas en el DTD. Empaquetar: el proceso de producir un documento XML desde objetos Java. Para realizar estas operaciones, cada clase generada contiene mtodos para empaquetar datos, validar contenidos, y extienden mtodos del marco de trabajo de unin que realizan el empaquetamiento. Sin embargo, a lo que nos centraremos en este tema es a Crear Objetos de Java a partir de Esquemas XML.

3.5.1 Desempaquetar (Construccin del rbol de Contenido)


Con los mtodos unmarshal, podemos construir un rbol objetos Java desde documentos XML que son ejemplares del esquema usado para generar las clases. El rbol de objetos construido con JAXB se llama un rbol de
46

contenido. Cada objeto del rbol corresponde a un elemento del documento XML. De forma semejante, cada objeto del rbol es un ejemplar de una clase del conjunto de clases generadas. Tambin podemos construir un rbol de contenido ejemplarizando objetos de las clases porque el rbol de contenido une el documento y las clases. Consideremos un fichero llamado march.xml, que contiene transacciones escritas en el mes de marzo. Para desempaquetar este documento XML en un rbol de contenido en el fichero CheckbookApp.java, tenemos que hacer lo siguiente:
1. Creamos un metodo llamado buildTrees: public static void buildTrees() throws Exception { } 2. En

nuestro nuevo FileInputStream:

mtodo leemos el fichero XML en un

File march = new File("march.xml"); FileInputStream fIn = new FileInputStream(march);

3. Llamamos al mtodo unmarshal de Transactions, que es la clase que representa el elemento raz transactions del checkbook.dtd:
try { marchTrans = marchTrans.unmarshal(fIn); } finally { fIn.close(); } .

4. Llamamos al mtodo buildTrees desde nuestro mtodo main: buildTrees();

En este punto, CheckbookApp genera un rbol de contenido desde march.xml. 3.5.1.1 Ejemplarizacin Si tenemos un DTD XML pero ningun ejemplar de documento XML vlido especificado por el DTD, podemos crear un documento XML vlido
47

construyendo un rbol de contenido desde las clases derivadas y empaquetando el rbol en un documento XML. Supongamos que deseamos crear un rbol de contenido que representa una lista de transacciones para el mes de abril. Para construir este rbol de contenido con ejemplarizacin tenemos que:
1. En el mtodo buildTrees, despus de la llamada para desempaquetar el

fichero march.xml, obtenemos la lista de entradas del objeto aprilTrans, creamos un nuevo objeto Check, representando el cheque para el alquiler del mes de abril:
List aprilEntries = aprilTrans.getEntries(); Check aprilRentCheck = new Check(); CheckCategory aprilRent = CheckCategory.RENT; aprilRentCheck.setCategory(aprilRent);

2. Seleccionamos el nombre de la entidad que recibe el cheque:


aprilRentCheck.setName(Gilchrest Gardens Manor);

3. Seleccionamos el nmero de cheque:


aprilRentCheck.setNumber(51);

Podemos pasar un int al mtodo setNumber porque especificamos en el esquema de unin que la propiedad number acepta y devuelve un int. 4. Seleccionamos la fecha para el cheque:
aprilRentCheck.setDate(TransDate.parseDate(04-12-2001));

Usamos el mtodo parseDate de la clase TransDate que proporcionamos en la seccion 3.2.5.1 Mtodos no Primitivos porque especificamos nuestro propio formato de fechas, que es:MM-dd-yyyy. 5. Seleccionamos la cuanta del cheque:
aprilRentCheck.setAmount(new java.math.BigDecimal(1500.00));

Podemos pasar un java.math.BigDecimal al mtodo setAmount porque especificamos en el esquema de unin que la propiedad amout acepta y devuelve un java.math.BigDecimal. 6. Seleccionamos el estado del cheque a pendiente:
Pending pending = new Pending();
48

aprilRentCheck.setPendVoidClrd(pending); 7. Aadimos el cheque a la lista de entradas del rbol de contenidos

aprilTrans:
aprilEntries.add(aprilRentCheck);

El objeto Entry representa una lista de transacciones, que incluye cualquier nmero de depsitos, de cheques, y de reintegros. Las clases que representan funciones comunes, implementan Entry. Despus de que creemos un cheque, un depsito, o un reintegro, lo agregamos a la lista de entradas. Puesto que la lista es modificable, las transacciones que le agregamos se aaden automticamente al rbol de contenido. Ahora tenemos dos rboles de contenido: uno para las transaciones de Marzo, y otro para las transaciones de Abril.

3.5.2 Validacin
El proceso de desempaquetar realiza validacin mientras est construyendo el rbol de contenido, por eso es imposible desempaquetar un documento XML a un rbol de contenido que es invlido con respecto al DTD. Podemos realizar validacin en cualquier momento despus de haber construido el rbol de contenido usando los mtodos validate o validateThis en cada clase generada. El mtodo validate valida completamente el subrbol enraizado en el objeto raz sobre el que le hemos llamado; el mtodo validateThis slo valida un objeto del rbol.

3.5.3 Trabajar con Datos (Acceso al rbol de Contenido)


Podemos trabajar con los objetos del rbol de contenido igual que lo haramos con cualquier objeto Java. De esta forma, JAXB proporciona un interfaz de programacin Java de datos XML, que podemos utilizar para integrar datos XML en las aplicaciones Java para tener acceso al contenido del rbol, utilizando las propiedades de las clases generadas. Para proporcionar funcionalidades especficas de la aplicacin, podemos extender las clases en vez de slo utilizarlas directamente. Por ejemplo, adems de acceder a un trozo de datos, tambin podramos querer realizar

49

algn clculo con los datos, para hacerlo podemos proporcionar estas funcionalidades en una subclase de una clase derivada. A continuacin mostraremos cmo utilizar las clases para construir representaciones de datos desde documentos XML y trabajar con los datos.

3.6 Creacin de Objetos de Java a partir de Esquemas XML


Esta seccin describe como JAXB representa el contenido de XML como objetos en Java. Especficamente, trataremos la Unin de esquemas XML a Identificadores Java. Despus de la lectura de esta seccin, deberamos sentirnos bastante cmodos con JAXB ya que podremos generar clases Java JAXB de un esquema XML.

3.6.1 La Representacin Java de Esquema XML


JAXB apoya la agrupacin de clases generadas e interfaces en paquetes Java. Un paquete comprende: Un nombre, que es sacado directamente del XML en el espacio de nombre URI, o especificado por una personalizacin obligatoria del XML . Un juego de interfaces Java que representan el contenido de los modelos dentro del esquema. Un Juego de interfaces de elementos Java que representan declaraciones de elemento que ocurren dentro del esquema. La claseAnObjectFactory contiene: Una instancia de mtodos de caso para cada interfaz Java contenido en el interfaz e interfaces de elementos Java dentro del paquete; por ejemplo, considerando un contenido de interfaz Java llamado Foo, el mtodo derivado sera:
public Foo createFoo() throws JAXBException;

50

Atributario de fbrica de caso Dinmico; crea una instancia del interfaz especificado en el contenido del interfaz de java; por ejemplo:
public Object newInstance(Class javaContentInterface) throws JAXBException;

getProperty y setProperty APIs que permite la manipulacin de propiedades proveer-especificaciones. Un Juego de typesafe enumerado de clases contiene paquetes javadoc.

3.6.2 Archivos Bsicos


Cada directorio de ejemplo contiene varios archivos bsicos: po.xsd es el esquema XML que usaremos como entrada al JAXB el compilador obligatorio, y del cual derivara el esquema JAXB del que las clases Java sern generadas. po.xml es el archivo que contiene el simple contenido XML. Main.java es la clase principal Java para cada ejemplo. build.xml es un archivo de proyecto Ant provedo para su conveniencia. Ant se emplea para generar, compilar, y correr el esquema de clases JAXB automticamente. El archivo build.xml vara a travs de los ejemplos. MyDatatypeConverter.java puede ser una clase Java usada para proporcionar el acostumbrado tipo de dato para conversin. binding.xjb son un archivo de declaraciones externo obligatorio que es pasado al compilador de uniones JAXB para personalizar la unin por default JAXB. example.xsd es un archivo de esquema corto que contiene conflictos de nombramiento deliberados.

3.6.3 Escribir un esquema de unin

51

Como vimos anteriormente, el esquema de unin contiene las instrucciones de cmo unir un DTD a las clases. La Descripcin de cmo realizar el esquema de unin fue vista en la seccin 3.2 Creacin del esquema de unin.

3.6.4 Ejecutar el compilador de esquema


Enseguida debemos ejecutar el compilador de esquema con el DTD y el esquema de unin como entradas, para generar el cdigo fuente. 3.6.4.1 La configuracin y la ejecucin El archivo build.xml incluido en cada directorio de ejemplo es un archivo del proyecto que, cuando corre, automticamente realiza los siguientes pasos: 1. Actualiza su CLASSPATH para incluir lo necesario por esquema JAXB que deriva las clases. 2. Corre la unin del compilador JAXB para generar clases java JAXB del esquema fuente XML, po.xsd, y pone las clases en un paquete llamado primer.po. 3. Genera la documentacin API del sacado por esquema JAXB derivando las clases que usan el instrumento Javadoc. 4. Compila las clases derivadas por el esquema JAXB. 5. Corre el Main para el ejemplo.

3.6.4.2 Opciones de la compilacin de JAXB El esquema JAXB del compilador de unin es localizado en el directorio <JWSDP_HOME>/jaxb/bin. Hay dos escrituras en este directorio: xjc.sh (Solaris/Linux) y xjc.bat (Windows). Tanto xjc.sh como xjc.bat toman las mismas opciones de lnea de mando. Podemos mostrar instrucciones de uso rpidas invocando las escrituras sin cualquier opcin, o con el interruptor de ayuda. La sintaxis es como sigue:.
52

xjc [-options ...] <schema>

// <schema> uno o mas archivos de esquemas para compilar

3.6.4.3 Acerca de los esquemas de unin para Java en la compilacin Cuando usted corre el compilador de unin JAXB contra el po.xsd el esquema XML usado en los ejemplos bsicos, el compilador de unin JAXB genera un paquete Java llamado primer.po conteniendo once clases, fabricacin de un total de doce clases en cada uno de los ejemplos bsicos: Estas clases y sus uniones especficas a la fuente XML el esquema para los ejemplos bsicos son descritas enseguida:

53

3.6.5 Ejemplo: Generar Clases desde un DTD


Como ejemplo de generacin de clases desde un DTD, consideremos el siguiente DTD, que se llama "priceList.dtd".
<!ELEMENT priceList (coffee)+ > <!ELEMENT coffee (name, price)> <!ELEMENT name (#PCDATA)> <!ELEMENT price (#PCDATA)>

El compilador de esquema JAXB es suficientemente poderoso como para hacer asunciones razonables desde el DTD y el esquema de unin que especifica slo el elemento raz del documento. Todo lo que necesitamos especificar en el esquema de unin es que el elemento price es convertido a una propiedad que devuelve y acepta un BigDecimal:
... <element name="priceList" type="class" class="PriceList" root="true"/> <element name="price" type="value" convert="BigDecimal"/> <conversion name="BigDecimal" type="java.math.BigDecimal"/>
54

...

Desde este DTD y este esquema de unin, el compilador de esquema genera una clase PriceList y una clase Coffee. La clase PriceList incluye un constructor y una lista de propiedades, a las que est unida el elemento coffee. La clase Coffee contiene un constructor y una propiedad para representar el nombre del caf y una propiedad para representar el precio. Los mtodos para acceder al precio son:
BigDecimal getPrice(); void setPrice(BigDecimal x);

Las dos clases tambin contienen mtodos para desempaquetar, validar y empaquetar. Recordemos que, Desempaquetar es el proceso de construir una representacin objeto del dato XML. La validacin es el proceso de chequear si el objeto est conforme a las especificaciones del DTD. Y Empaquetar es el proceso de generar datos XML desde una representacin objeto. 3.6.5.1 Construir Representaciones Objeto de Datos XML Despus de generar nuestras clases, podemos escribir aplicaciones Java que las usen para construir representaciones objeto del documento XML que sean vlidos con respecto al DTD. Cada objeto corresponde a un elemento del documento XML. De forma similar, cada objeto es un ejemplar de una clase del conjunto de clases generadas. Como los objetos se mapean tanto al documento como a las clases, tenemos dos formas diferentes de construir el rbol de objetos Java: desempaquetando un documento XML vlido, o ejemplarizando objetos desde las clases. De esta forma, JAXB nos permite procesar documentos XML existentes y crear nuevos datos XML ejemplarizando las clases generadas. Supongamos que tenemos este documento XML:
<priceList> <coffee> <name>Arabica</name> <price>13.50</price> </coffee> <coffee> <name>Mocha Java</name> <price>11.95</price>
55

</coffee> <coffee> <name>Sumatra</name> <price>12.50</price> </coffee> </priceList>

Para desempaquetar este documento XML, creamos un stream de entrada desde l y llamamos al mtodo unmarshal de la clase PriceList:
FileInputStream fis = new FileInputStream("priceList.xml"); PriceList myPrices = PriceList.unmarshal(fis);

Ahora tenemos un rbol de objetos Java con el objeto myPrices como la raz del rbol. Supongamos que queremos crear nuestra propia lista de precios de cafs como un documento XML. Primero creamos el rbol de objetos por ejemplarizacin y luego empaquetamos el rbol en un documento XML. Para crear un rbol de objetos usando ejemplarizacin, creamos un objeto PriceList, obtenemos la lista de objetos Coffee desde l, creamos un nuevo objeto Coffee, y lo aadimos a la lista:
PriceList myNewPrices = new PriceList(); List listOfCoffees = myNewPrices.getCoffees(); Coffee zCoffee = new Coffee(); zCoffee.setName("Zapoteca"); zCoffee.setPrice("15.00"); listOfCoffees.add(zCoffee);

Una vez que tenemos el dato XML en forma de un rbol de objetos, podemos trabajar con los datos como con cualquier otro objeto Java. De esta forma, JAXB proporciona un interface de programacin Java para XML y nos permite la integracin de datos XML dentro de aplicaciones Java.

3.7 Creacin de Esquemas XML a partir de Objetos de Java.


Como vimos en la seccin 3.5 Construccion de Representaciones de Datos, al proceso de producir un documento XML desde objetos java, se le llama Empaquetar.

56

Tanto si construmos el rbol de contenido usando desempaquetamietno o ejemplarizacin, podemos empaquetar el rbol a un nuevo documento XML usando lo mtodo marshal. Esto significa que JAXB tambin permite que creemos nuevos documentos XML que son vlidos con respecto al DTD fuente. El proceso de empaquetado comprueba si el rbol de contenido se ha validado antes de empaquetarlo en caso de que hayamos realizado cambios a los objetos del rbol. As pues, igual que es imposible desempaquetar un documento invlido, es imposible empaquetar un rbol de contenido invlido. La Figura siguiente ilustra dos formas para construir representaciones de datos:

3.7.1 Validacin del rbol de Contenido


Antes de empaquetar un rbol de contenido a un documento XML, debemos asegurarsnos de que el rbol de contenido es vlido con respecto al DTD. Si utilizamos desempaquetamiento en vez de ejemplarizacin para construir el rbol de contenido, y no hemos modificado el rbol, no necesitamos validar antes de empaquetar porque el proceso de desempaquetamiento incorpora la validacin. Si utilizamos la ejemplarizacin para construir el rbol, siempre necesitamos realizar explcitamente la validacin antes de empaquetar. Utilicemos el ejemplo de la seccin 3.5.1 Desempaquetar (Construccin del rbol de Contenido) Para validad mbos rboles de contenido tenemos que:

57

1. Creamos un mtodo llamado validateTrees:


public static void validateTrees() throws Exception {} 2. Dentro del mtodo, llamamos a validate sobre marchTrans y

aprilTrans:
marchTrans.validate(); aprilTrans.validate(); 3. Llamamos a validateTrees desde el mtodo main: validateTrees();

3.7.2 Empaquetar el rbol de Contenido a Documentos XML


Despus de validar los rboles de contenido, estamos listos para empaquetarlos en nuevos documentos XML. Tanto si construmos un rbol de contenido usando desempaquetamiento o ejemplarizacin, empaquetamos un rbol de la misma forma. Para empaquetar los rboles de contenido: 1. Creamos un nuevo mtodo llamado marshalTrees:
public static void marshalTrees() throws Exception {}

2. En el nuevo mtodo, creamos nuevos ficheros, para contener los contenidos actualizados de mbos rboles:
File march_new = new File(march_new.xml); File april_new = new File(april_new.xml);

3. Creamos el objeto OutputStream para enviarlo al mtodo marshal:


FileOutputStream fMOut = new FileOutputStream(march_new); FileOutputStream fAOut = new FileOutputStream(april_new);

4. Llamamos al mtodo marshal sobre cada rbol:


try { marchTrans.marshal(fMOut); aprilTrans.marshal(fAOut); } finally { fMOut.close(); fAOut.close();
58

5. Llamamos a marshalTrees desde el mtodo main:


marshalTrees();

Despus de que recompilemos las clases y ejecutemos CheckbookApp, veremos los ficheros march_new.xml y april_new.xml en el directorio. Si comparamos march.xml con march_new.xml, encontraremos que la nica diferencia entre los dos ficheros es el nombre del cheque de la tienda de comestibles, que modificamos. JAXB preserva la equivalencia entre un documento XML y el mismo documento XML formados desde su rbol de contenido.

59

Parte IV. CREANDO UNA APLICACIN JAXB


4.1 Consideraciones Previas
Primero que nada, debemos mencionar que software estamos utilizando y los requerimientos para el desarrollo de los siguientes ejemplos. Netbeans 5.5.1 (entorno IDE) JAXB 2.0 Java Application Platform SDK Mquina Virtual de Java (Jdk 1.6)

Advertencia: los ejemplos siguientes se recomienda ejecutarlos sobre estos paquetes, si se implementan sobre otras versiones pueden no funcionar. Ya que en nuestra recopilacin de informacin tuvimos desagradables y frustrantes experiencias por no mencionar lo anterior. Adems se recomienda no utilizar espacios en los nombres de los proyectos, archivos o rutas a utilizar para evitar problemas.

4.2 EJEMPLO 1: Utilizando la operacin unmarshal


Para el desarrollo de una aplicacin java utilizando JAXB se requiere hacer los siguientes pasos generales: Crear un proyecto Aplicacin Java en NetBeans. Definir el esquema fuente. Crear un documento XML que se valide con el esquema fuente. Compilar el esquema con la aplicacin del compilador JAXB (xjc.bat en nuestro caso), el cual generar una carpeta conteniendo los archivos .java por default en la ruta donde se encuentre el archivo xjc.bat. Aadir el paquete de los archivos generados por el compilador JAXB. Aadir los archivos .jar . Redefinir el mtodo main para manipular las clases generadas anteriormente

60

A continuacin se describe detalladamente el proceso de creacin, compilacin e implementacin JAXB.


1.

Creamos una aplicacin java en NetBeans (men File, New Proyect, carpeta general, Java Aplication) y le ponemos el nombre prueba. No se nos olvide cambiar la ruta de ubicacin del proyecto a la unidad C, si no eres un experto y quieres evitarte posibles complicaciones. Ahora creamos un esquema el cual definir dos tipos de listas principales: una de negocios y otra de personas. Si no comprendes el esquema consulta la seccin 2.3 Xml Schema. Menu file, new_file, carpeta xml, xml eschema.
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.netbeans.org/schema/schema" xmlns:tns="http://xml.netbeans.org/schema/schema" elementFormDefault="qualified"> <xsd:element name="Root" type="tns:TipoRoot"/> <xsd:complexType name="TipoRoot"> <xsd:sequence> <xsd:element name="ListaPersona" type="tns:TipoListaPersona"/> <xsd:element name="ListaNegocio" type="tns:TipoListaNegocio"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TipoListaPersona"> <xsd:sequence> <xsd:element name="Persona" type="tns:TipoPersona" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TipoPersona"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="apellido" type="xsd:string"/> <xsd:element name="fechaNacimiento" type="xsd:date"/> <xsd:element name="id" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TipoListaNegocio"> <xsd:sequence> <xsd:element name="Negocio" type="tns:TipoNegocio" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence>

2.

61

</xsd:complexType> <xsd:complexType name="TipoNegocio"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="codigo" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:schema>

3.

Creamos un documento xml (file, new file, carpeta xml, documento xml), next (escribimos el nombre platillos), next (elegir la opcion xmlschema-constrained-document), next (en schema url elegimos la direccion donde se encuentra el eschema creado en el paso anterior en la opcion root element) y por utimo escribimos el siguiente documento.
<?xml version="1.0" encoding="UTF-8"?> <!-Document : f.xml Created on : 7 de noviembre de 2007, 03:47 PM Author : francisco Description: Purpose of the document follows. --> <Root xmlns='http://xml.netbeans.org/schema/schema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://xml.netbeans.org/schema/schema file:/C:/Documents %20and%20Settings/francisco/prueba/src/f.xsd'> <ListaPersona> <Persona> <nombre>Antonia</nombre> <apellido>Lopez</apellido> <fechaNacimiento>1887-10-12</fechaNacimiento> <id>1</id> </Persona> <Persona> <nombre>Poncho</nombre> <apellido>Rojas</apellido> <fechaNacimiento>1986-12-12</fechaNacimiento> <id>1</id> </Persona> </ListaPersona>

62

<ListaNegocio> <Negocio> <nombre>Microsoft</nombre> <codigo>0</codigo> </Negocio> <Negocio> <nombre></nombre> <codigo>IBM</codigo> </Negocio> </ListaNegocio> </Root> 4. Ahora vamos a compilar el esquema anterior con el compilador de JAXB

para generar las clases .JAVA para empezar iniciamos la lnea de comandos cmd.exe, (inicio, ejecutar, y tecleamos cmd), una vez ah, cambiarse al directorio donde se encuentra instalada java plataforma Application que en nuestro caso se encuentra en la ruta c:\Sun\SDK\bin\ . una vez estando en esta carpeta ejecutamos la siguiente sentencia (dependiendo de la ruta donde est nuestro esquema). Para evitarnos complicaciones, hemos copiamos el esquema fuente al directorio raz, por lo que la sentencia quedara as: xjc c:\f.xsd Lo ejecutamos:

Algo que debemos mencionar es que el compilador enlazante permite o acepta ciertas opciones adicionales al momento de generar las clases para nuestro esquema; en especfico, podemos observar la existencia de un parmetro de ms, -p ejemplo, donde -p nos ayuda a redefinir el paquete donde se van a generar nuestras clases. El formato general de la instruccin xjc es: xjc [-options ...] <schema>

63

Donde las opciones ms comunes pueden ser: Argumento opcin <schema> -nv Descripcin
Uno o ms archivos de esquemas a compilar No realiza una validacin estricta en el esquema de entrada. Por default xjc realiza una validacin esetricta de el esquema fuente antes de procesarlo.Simplemente hace un poco menos de validacin

-extension

Por default, xjc estrictamente fuerza las reglas obtenidas de la compatibilidad de la especificacin de JAXB; usando el cambio de extension puedes activar Extensiones de vendedores. Especifica uno o ms archivos vinculantes externos para procesar (cada archivo debe tener su propio b switch). Puedes tener un nico archivo vinculante que contiene las personalizaciones de mltiples esquemas, o puedes romper las personalizaciones en mltiples archivos vinculantes. Por default, xjc genera las clases de contenido en el directorio actual. Usa esta opcin para especificar un directorio alternativo. El directorio debe de existir; xjc no crear el directorio por ti. Especifica donde encontrar los archivos de una clase aplicacin del cliente usadas por las personalizaciones <jxb:javaType> y <xjc:superClass> . Trata el esquema de entrada como un Schema W3C XML(por default) Trata el esquema de entrada como un XML DTD Muestra este mensaje de ayuda

-b <file>

-d <dir>

-classpath <arg>

-xml schema -dtd -help

5.

Como se muestra en la pantalla el compilador de JAXB ( xjc.bat ) genera automticamente los archivos .java los cuales se crearon en la carpeta donde se encuentra el archivo de xjc, dentro de una carpeta de nombre ejemplo. Continuando, vamos a anexar al proyecto los archivos generados .java; para realizar esto existen varias formas, una de las ms sencillas es simplemente copiar la carpeta generada por la ejecucin del comando xjc, y pegarla en la ruta donde se cre nuestro proyecto en NetBeans, en la carpeta scr.
64

6.

Una vez agregados los .java vamos agregar los .jar, click derecho en la carpeta librera elejimos la opcion ADD JAR\Folder nos vamos a la ruta donde tenemos instalado el JDK 6.0 y agregamos los archivos .jar mostrados a continuacin :

7.

Ahora viene lo interesante, utilizar las clases java generadas y realizar las operaciones de unmarshall para este ejemplo (la pgina fuente se encuentra en :).
package prueba; import java.io.FileInputStream; import java.util.Iterator; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement;

65

import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import ejemplo.TipoListaNegocio; import ejemplo.TipoListaPersona; import ejemplo.TipoNegocio; import ejemplo.TipoPersona; import ejemplo.TipoRoot; public class Main { /** Creates a new instance of Main */ public Main(){ try { //"org.nextbeans.xml.schema.schema" -> Nombre del paquete donde encontrar las clases generadas con el //compilador de JAXB (xjc) Unmarshaller unmarshaller = JAXBContext.newInstance("ejemplo").createUnmarshaller(); //Es necesario el cast a JAXBElement y luego la aplicacion del metodo getValue() porque el unmarshal no retorna el objeto de la clase TipoRoot. //"xml/myFile.xml" archivo xml donde se encuentran los datos TipoRoot root = (TipoRoot)((JAXBElement)unmarshaller.unmarshal( new FileInputStream("src/f.xml"))).getValue(); TipoListaPersona tipoListaP = root.getListaPersona(); Iterator<TipoPersona> it = tipoListaP.getPersona().iterator(); System.out.println("*********Lista Persona*********"); while ( it.hasNext() ){ TipoPersona tp = it.next(); System.out.println("El nombre es == " + tp.getNombre()); System.out.println("El apellido es == " +tp.getApellido()); System.out.println("La fecha de nacimiento es == " + tp.getFechaNacimiento().toString() ); System.out.println("El id es == " + tp.getId()); } System.out.println("********Lista Negocio**********"); TipoListaNegocio listaNegocio = root.getListaNegocio(); Iterator<TipoNegocio> itNg = listaNegocio.getNegocio().iterator(); while ( itNg.hasNext() ){ TipoNegocio tn = itNg.next(); System.out.println("El nombre es == " + tn.getNombre()); System.out.println("El codigo es == " + tn.getCodigo()); } } catch (Exception ex) {
66

ex.printStackTrace(); } } /** * @param args the command line arguments */ public static void main(String[] args) { Main m = new Main(); } } 8.

Ejecutamos nuestra aplicacin. Si todo se hizo correctamente debera de aparecerte algo como lo que se muestra a continuacin en la ventana inferior del IDE NetBeans (ventana de salida).
init: deps-jar: Compiling 1 source file to C:\Documents and Settings\francisco\prueba\build\classes compile: *********Lista Persona********* El nombre es == Antonia El apellido es == Lopez La fecha de nacimiento es == 1887-10-12 El id es == 1 El nombre es == Poncho El apellido es == Rojas La fecha de nacimiento es == 1986-12-12 El id es == 1 ********Lista Negocio********** El nombre es == Microsoft El codigo es == 0 El nombre es == IBM El codigo es == 1 debug: BUILD SUCCESSFUL (total time: 2 seconds)

4.3 EJEMPLO 2: Utilizando la operacin marshal


Una vez que tenemos el resultado de los pasos mencionados previamente para el ejemplo anterior, procedemos a utilizar el objeto

67

Marshal para poder realizar la operacin de empaquetacin u organizacin de un rbol de contenido Java en una salida XML. Para hacer lo anterior solo modificamos el constructor Main(), y hacemos que asemeje a lo siguiente:
//Adems de las sentencias import que ya tenemos agregamos las siguientes import ejemplo.ObjectFactory; import javax.xml.bind.Marshaller; //........ lo que ya estaba public Main(){ try { //"org.nextbeans.xml.schema.schema" -> Nombre del paquete donde //encontrar las clases generadas con el //compilador de JAXB (xjc) Unmarshaller unmarshaller = JAXBContext.newInstance("ejemplo").createUnmarshaller(); //Es necesario el cast a JAXBElement y luego la aplicacion del metodo getValue() porque el unmarshal no retorna el objeto de la clase TipoRoot. //"xml/myFile.xml" archivo xml donde se encuentran los datos TipoRoot root = (TipoRoot)((JAXBElement)unmarshaller.unmarshal( new FileInputStream("src/f.xml"))).getValue(); //Comenzamos con la operacin de unmarshal JAXBContext jaxbContext = JAXBContext.newInstance("ejemplo"); Marshaller marshaller = jaxbContext.createMarshaller(); ObjectFactory factory = new ObjectFactory(); JAXBElement<TipoRoot> er = factory.createRoot(root); marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE); marshaller.marshal(er, System.out); } catch (Exception ex) { ex.printStackTrace(); } }

Si lo hiciste correctamente y si no hay algn otro detalle, al ejecutar el proyecto te debera de aparecer en la ventana de salida lo siguiente:
init: deps-jar: Compiling 1 source file to C:\Documents and Settings\francisco\prueba\build\classes compile:
68

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root xmlns="http://xml.netbeans.org/schema/schema"> <ListaPersona> <Persona> <nombre>Antonia</nombre> <apellido>Lopez</apellido> <fechaNacimiento>1887-10-12</fechaNacimiento> <id>1</id> </Persona> <Persona> <nombre>Poncho</nombre> <apellido>Rojas</apellido> <fechaNacimiento>1986-12-12</fechaNacimiento> <id>1</id> </Persona> </ListaPersona> <ListaNegocio> <Negocio> <nombre>Microsoft</nombre> <codigo>0</codigo> </Negocio> <Negocio> <nombre>IBM</nombre> <codigo>1</codigo> </Negocio> </ListaNegocio> </Root> debug: BUILD SUCCESSFUL (total time: 2 seconds)

4.4 EJEMPLO 3: Definiendo un rbol de contenido y transformarlo en formato XML


En este sencillo ejemplo vamos a seguir trabajando con el proyecto creado anteriormente. Vamos a utilizar las clases generadas por el compilador JAXB para poder construir manualmente un rbol de contenido y posteriormente transformar este rbol en formato XML y visualizarlo en la salida estndar(generalmente la pantalla). Abrimos nuestro proyecto prueba, y nos posicionamos en el constructor de la clase Main(). Luego modificamos el cdigo de tal forma que quede similar al siguiente:
69

public Main(){ try { //Creamos un objeto JAXBContext JAXBContext jaxbContext = JAXBContext.newInstance("ejemplo"); //Creamos un objeto de la clase Marshaller y ObjectFactory para poder //crear los elementos individuales del rbol java Marshaller marshaller = jaxbContext.createMarshaller(); ObjectFactory factory = new ObjectFactory(); //Definimos las variables que contendrn los datos de una persona y un negocio TipoNegocio tn = factory.createTipoNegocio(); TipoPersona tp = factory.createTipoPersona(); //Definimos los datos de el negocio tn.setNombre("ALICA"); tn.setCodigo(3); //Definimos los datos de la persona tp.setNombre("CINTHIA"); tp.setId(5); tp.setApellido("MATA"); //Creamos una Lista de personas y una lista de negocios TipoListaNegocio tln = factory.createTipoListaNegocio(); TipoListaPersona tlp = factory.createTipoListaPersona(); //Agregamos a las persona y al negocio antes especificado a sus correspondientes // listas tln.getNegocio().add(tn); tlp.getPersona().add(tp); //Creamos una instancia del elemento TipoRoot TipoRoot r= factory.createTipoRoot(); //Agregamos al rbol de contenido las listas de negocios y personas r.setListaNegocio(tln); r.setListaPersona(tlp); //Creamos un elemento JAXB para poder transformar el rbol de contenido ya //generado JAXBElement<TipoRoot> er = factory.createRoot(r); //Establecemos el formato de salida y realizamos la operacin de marshal marshaller.setProperty("jaxb.formatted.output", Boolean.TRUE); marshaller.marshal(er, System.out);

70

} catch (Exception ex) { ex.printStackTrace(); } } El resultado de la ejecucin del proyecto:

4.5 EJEMPLO 4: Generando un esquema XML a partir de clases java


JAXB 2.0 soporta las transformaciones bidireccionales de los documentos XML y rboles de contenido Java. Adems, dentro de la carpeta bin (donde se encuentra el archivo del comando, xjc.bat) existe un archivo el cual nos puede ser de gran utilidad, ya que puede generar, a la inversa del xjc, esquemas XML a partir de clases java. El archivo-comando que hace posible esto es el

71

schemagen.bat, el cual recibe como parmetro de entrada la ruta de la clase raz java, de la cual generar el esquema. Recordemos que anteriormente generamos el conjunto de clases java a partir de un esquema, ahora vamos a hacer lo inverso con el comando schemagen.bat, pasndole como argumento la ruta del archivo TipoRoot.java:

Una vez hecho lo anterior checamos que nos haya creado el esquema en la ruta donde tenemos el archivo schemagen.bat. Obtenemos un archivo denominado shcema1.xsd que contiene lo siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="TipoRoot"> <xs:sequence> <xs:element name="ListaPersona" type="TipoListaPersona"/> <xs:element name="ListaNegocio" type="TipoListaNegocio"/> </xs:sequence> </xs:complexType> <xs:complexType name="TipoListaPersona"> <xs:sequence> <xs:element name="Persona" type="TipoPersona" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="TipoPersona"> <xs:sequence> <xs:element name="nombre" type="xs:string"/> <xs:element name="apellido" type="xs:string"/> <xs:element name="fechaNacimiento" type="xs:anySimpleType"/> <xs:element name="id" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="TipoListaNegocio">
72

<xs:sequence> <xs:element name="Negocio" type="TipoNegocio" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="TipoNegocio"> <xs:sequence> <xs:element name="nombre" type="xs:string"/> <xs:element name="codigo" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:schema>

73

ANEXOS

Proceso de Instalacin de JAXB 2.0


Los ejemplos de esta obra son para trabajar JAXB 2.0 junto con 5.5.1 Software necesario para instalar el JAXB Plataforma jdk1.6.0_02 jwsdp-2_0-windows-i586 paquete WSDP java_app_platform_sdk-5_02-windows-nojdk tomcat 5.0 solo funciona con esta versin no se instala se descomprime en c:\. NetBeans

Una ves que se cuente con los anteriores software lo que hay que hacer es seguir los pasos. 1. Instalar primero la plataforma jdk1.6.0_02 una vez instalada instalar el java_app_platform_sdk-5_02-windows-nojdk ambas instalaciones no tienen ninguna complicacin Nota: si ya tienes instalado el netbeans ya tienes instalada la plataforma jdk-. 2. Ejecuta el paquete Jwsdp-2_0.

74

3. Aparece el asistente de la instalacin presione siguiente (next).

4. En la siguiente ventana acepta la licencia de uso y presiona siguiente para continuar. 5. En la cuarta ventana elige la maquina virtual sobre la cual el WSDP ejecutara la busca por default. En caso de no tenerla no se podr seguir con la instalacin. 6. Antes de continuar con la instalacin debemos descomprimir el archivo tomcat 5.0 en la unidad c:\ para evitar complicaciones.

75

7. En la ventana de instalacin click en browse seleccionar la ruta de la carpeta de tomcat 5.0 y click siguiente.

8. En tipo de instalacin seleccionar instalacin typical. 9. Definimos el usuario tomcat.

76

Nota: este usuario debe estar definido en un archivo de tomcat de nombre manager el cual esta dentro de la carpeta server:
<tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat" /> 10. En este paso hay que crear la siguiente ruta

c:\archivo de programas\java\jdk1.6.0_02\jre\lib\endorsed y en esta ubicacin hay que copiar los archivos que se encuentran en esta otra ubicacin c:\sun\jwsdp-2.0\jaxp\lib\endorsed.

11. En la instalacin click en siguiente y por ltimo finalizar.

77

INDICE
PARTE I. INTRODUCCIN......................................................................................1
1.1 Qu es JAXB?.............................................................................................................................................1 1.2 Caractersticas de JAXB..............................................................................................................................1 1.2.1 Las aplicaciones JAXB usan Tecnologa Java y XML...........................................................................2 1.2.2 Las Aplicaciones JAXB son Rpidas.....................................................................................................3 1.2.3 Las Aplicaciones JAXB son Fciles de Crear y de Usar........................................................................4 1.2.4 Las Aplicaciones JAXB Pueden Convertir Datos..................................................................................4 1.2.5 Las Aplicaciones JAXB Pueden Personalizarse.....................................................................................5 1.2.6 Las Aplicaciones JAXB son Extensibles................................................................................................6 1.3 Arquitectura de JAXB.................................................................................................................................6 1.4 El proceso de vinculacin de JAXB............................................................................................................8 1.5 Framework vinculante JAXB....................................................................................................................10 1.5.1 El paquete javax.xml.bind....................................................................................................................10 1.5.1.1 Desorganizacin............................................................................................................................11 1.5.1.2 La Organizacin............................................................................................................................12 1.5.1.3 La Validacin................................................................................................................................12 1.6 Versiones......................................................................................................................................................13

PARTE II. DOCUMENTOS XML............................................................................14


2.1 Qu es XML?............................................................................................................................................14 2.2 Definicin de Tipo de Documento (DTD).................................................................................................15 2.2.1 Declaracin de Tipo de Documento.....................................................................................................16 2.2.2 Declaracin de Elementos....................................................................................................................17 2.2.2.1 Elementos vacos...........................................................................................................................17 2.2.2.2 Elementos con slo elementos......................................................................................................18 2.2.2.3 Elementos de Contenido Mixto.....................................................................................................22 2.2.2.4 Elementos ANY............................................................................................................................23 2.2.3 Declaracin de Atributos......................................................................................................................23 2.2.3.1 Atributos CDATA y NMTOKEN.................................................................................................24 2.2.3.2 Atributos enumerados y notaciones..............................................................................................24 2.2.3.3 Atributos ID e IDREF...................................................................................................................25 2.3 XML Schema...............................................................................................................................................25 2.3.1 Estructura Mnima de un Esquema.......................................................................................................27 2.3.2 Tipos de Datos......................................................................................................................................27 2.3.3 Diagrama de los Tipos de Datos que manejan los Schemas.................................................................28 2.4 Documento XML........................................................................................................................................28 2.4.1 Ejemplo: Diferencias entre DTD y Schemas........................................................................................29

PARTE III. ACCESO A UN DOCUMENTO XML...................................................31


3.1 Construccin de una aplicacin JAXB.....................................................................................................31

78

3.2 Creacin del Esquema de Unin...............................................................................................................32 3.2.1 Declaracin de Unin de Elementos ....................................................................................................33 3.2.2 Declaracin de Unin de Atributos......................................................................................................34 3.2.3 Declaracin de Unin de Contenido.....................................................................................................35 3.2.4 Ejemplo: Esquema de Unin para book.dtd.........................................................................................37 3.2.5 Especificando Tipos .............................................................................................................................38 3.2.5.1 Especificar Tipos No Primitivos...................................................................................................38 3.2.5.2 Especificar Tipos Primitivos ........................................................................................................40 3.2.6 Creacin de Tipos de Datos Enumerados.............................................................................................41 3.2.7 Creacin de interfaces...........................................................................................................................42 3.3 Generacin de los Ficheros Fuente de Java.............................................................................................43 3.4 Configuracin de la aplicacin JAXB ......................................................................................................45 3.5 Construccin de Representaciones de Datos............................................................................................45 3.5.1 Desempaquetar (Construccin del rbol de Contenido).......................................................................46 3.5.1.1 Ejemplarizacin............................................................................................................................47 3.5.2 Validacin.............................................................................................................................................49 3.5.3 Trabajar con Datos (Acceso al rbol de Contenido).............................................................................49 3.6 Creacin de Objetos de Java a partir de Esquemas XML.....................................................................50 3.6.1 La Representacin Java de Esquema XML..........................................................................................50 3.6.2 Archivos Bsicos..................................................................................................................................51 3.6.3 Escribir un esquema de unin...............................................................................................................51 3.6.4 Ejecutar el compilador de esquema .....................................................................................................52 3.6.4.1 La configuracin y la ejecucin ..................................................................................................52 3.6.4.2 Opciones de la compilacin de JAXB..........................................................................................52 3.6.4.3 Acerca de los esquemas de unin para Java en la compilacin ...................................................53 3.6.5 Ejemplo: Generar Clases desde un DTD..............................................................................................54 3.6.5.1 Construir Representaciones Objeto de Datos XML......................................................................55 3.7 Creacin de Esquemas XML a partir de Objetos de Java.....................................................................56 3.7.1 Validacin del rbol de Contenido.......................................................................................................57 3.7.2 Empaquetar el rbol de Contenido a Documentos XML......................................................................58

PARTE IV. CREANDO UNA APLICACIN JAXB.................................................60


4.1 Consideraciones Previas.............................................................................................................................60 4.2 EJEMPLO 1: Utilizando la operacin unmarshal..................................................................................60 4.3 EJEMPLO 2: Utilizando la operacin marshal.......................................................................................67 4.4 EJEMPLO 3: Definiendo un rbol de contenido y transformarlo en formato XML.........................69 4.5 EJEMPLO 4: Generando un esquema XML a partir de clases java....................................................71

ANEXOS..................................................................................................................74
Proceso de Instalacin de JAXB 2.0................................................................................................................74

79

También podría gustarte