Tutorial Jaxb
Tutorial Jaxb
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.
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.
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.
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.
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.
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
Aplicacin java
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
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.
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.
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.
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.
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 []>
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)
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>
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>
19
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.
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.
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.
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.
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
</xs:element> </xs:schema>
30
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. Los esquemas de unin deben declarar al menos un elemento raz. Para declararlo escribimos:
32
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.
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();
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.
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.
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.
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/>
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/>
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
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(); }
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);
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
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 { } }
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.
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
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(); } .
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);
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
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.
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.
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.
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.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
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
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
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.
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:
57
aprilTrans:
marchTrans.validate(); aprilTrans.validate(); 3. Llamamos a validateTrees desde el mtodo main: validateTrees();
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);
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
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.
60
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>
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)
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)
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
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
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
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.
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.
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
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
ANEXOS..................................................................................................................74
Proceso de Instalacin de JAXB 2.0................................................................................................................74
79