Sunteți pe pagina 1din 5

Cristian Rinaldi: Hola Sara, bienbenida a Juglar: Tu problema es con el compilador de JAXB?

, cuando pasas los schemas a una jer arqua de clases en Java (esto de manera externa). O bien ya tens hecha la jerarqua de clases y el problema lo tens en tiempo de co mpilacin cuando trabajas con stas?. Acordate de incluir en las Libreras del proyecto los siguiente jars: JAXB 2.0 - activation.jarJAXB 2.0 - jaxb-api.jarJAXB 2.0 - jaxb-impl.jarJAXB 2.0 - xjc.jarJAXB 2.0 - jsr173_api.jarSi me decis bin tu configuracin del entorno te podr ayudar mejor, como que jdk ests usando, y que IDE. Luego te postear un ejemplo para que lo comprendas mejor. Saludos Cristian Cristian Rinaldi: Hola Sara, como lo promet aca va un pequeo ejemplo de uso de JAXB: La configuracin de mi entorno a la hora de realizar y correr este ejemplo fue la siguiente: NetBeans5.5jdk 1.6Sun Java system application server Lo primero que haremos es c rear un documento xml schema, a esto lo podemos realizar de varias maneras, una de ellas es utilizando el editor de schemas de netbeans (solo si instalaste el E nterprise Pack). Para ms informacin sobre los xml schema, te aconsejo que leas http://www.w3.org/TR /xmlschema11-1/. El Enterprise Pack puedes descargarlo aqu http://www.netbeans.org/products/enterp rise/ El archivo que genere es el siguiente: Cdigo GeSHi (xml): <?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" maxO ccurs="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" maxO ccurs="unbounded"/>

</xsd:sequence> </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> Created by GeSHI 1.0.7.18 Una vez creado el archivo, en una consola de comandos, te sitas en el directorio donde tengas est instalado el servidor de aplicaciones (Sun Java System Applicati on Server) y dentro de la carpeta bin, encontrars el compilador de jaxb, este se llama, xjc. Aqu ejecutas xjc <xml schema file>. Donde <xml schema file> es la rut a al archivo antes generado. Esto crear dentro de bin, una jerarqua de carpetas que contendrn las clases que cor responden al schema. Verifica que tengas permiso de escritura sobre la carpeta b in, o mediante las opciones del compilador direccion la salida a otro directotio. En el caso del archivo de ejemplo las clases generadas son las siguientes: ObjectFactory.javaTipoListaNegocio.javaTipoListaPersona.javaTipoNegocio.javaTipo Persona.javaTipoRoot.javapackage-info.javaCon las clases ya definidas, pasamos a crear un proyecto Java Application con NetBeans. Esto generar una estructura de directorios, donde encontrars una carpeta nombrada src. Dentro de sta copiars lo qu e gener el compilador de jaxb. Una vez realizado esto, en el proyecto de NetBeans aparecer un paquete nuevo cont eniendo las clases generadas. Ya hemos realizado el schema, pero nos faltan los datos, por lo que vamos a gene rar un documento xml, el cual se debe ajustar al schema antes generado. Esta tar ea la podemos realizar con NetBeans, File->New File->XML->XML Document. En las p antallas subsecuentes hay que asegurarse de colocar XML-Schema Constrained Docum ent para que el documento sea vlido segn el schema. El archivo xml que yo gener es el siguiente: Cdigo GeSHi (xml): <?xml version="1.0" encoding="UTF-8"?> <!-Document : xml.xml Created on : 22 de mayo de 2007, 19:52 Author : csrinaldi 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:/home/csrina ldi/SoftwareJava/worckspace/JAXBexample/xml/schema.xsd'> <ListaPersona> <Persona> <nombre>XXX</nombre> <apellido>A-XXX</apellido> <fechaNacimiento>1981-07-17</fechaNacimiento> <id>0</id> </Persona> <Persona> <nombre>YYY</nombre> <apellido>A-YYY</apellido> <fechaNacimiento>1982-07-17</fechaNacimiento> <id>1</id> </Persona> </ListaPersona>

<ListaNegocio> <Negocio> <nombre>Java</nombre> <codigo>0</codigo> </Negocio> <Negocio> <nombre>Solaris</nombre> <codigo>1</codigo> </Negocio> </ListaNegocio> </Root> Created by GeSHI 1.0.7.18 Una vez que tenemos todo esto creado, vallamos a lo interesante. Creamos la clase que manejar los datos del XML. Estos datos se levantarn del archi vo que generamos. En mi caso el archivo se llama myFile.xml y se encuntra dentro de una carpeta xml en el proyecto. La clase que codifiqu se llama Main y su cdigo es el siguiente: Cdigo GeSHi (java): /* * Main.java * * Created on 23 de mayo de 2007, 00:25 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package jaxbexample; import java.io.FileInputStream; import java.util.Iterator; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import org.netbeans.xml.schema.schema.TipoListaNegocio; import org.netbeans.xml.schema.schema.TipoListaPersona; import org.netbeans.xml.schema.schema.TipoNegocio; import org.netbeans.xml.schema.schema.TipoPersona; import org.netbeans.xml.schema.schema.TipoRoot; /** * * @author csrinaldi */ public class Main { /** Creates a new instance of Main */ public Main(){ try { //"org.netbeans.xml.schema.schema" -> Nombre del paquete donde encont rar las clases generadas con el //compilador de JAXB (xjc) Unmarshaller unmarshaller = JAXBContext.newInstance("org.netbeans.xml .schema.schema").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("xml/myFile.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.getFechaN acimiento().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) { ex.printStackTrace(); } } /** * @param args the command line arguments */ public static void main(String[] args) { Main m = new Main(); } } Created by GeSHI 1.0.7.18 Algunas explicaciones sobre el cdigo: Unmarshaller unmarshaller = JAXBContext.newInstance("org.netbeans.xml.schema.sch ema").createUnmarshaller(); Aqu le dices cual es el paquete que contiene la jerarqua de clases generada con el compilador de JAXB, en nuestro caso "org.netbeans.xml.schema.schema", para que se pueda realizar el mapeo del xml sobre el rbol de objetos. TipoRoot root = (TipoRoot)((JAXBElement)unmarshaller.unmarshal( new FileInputSt ream("xml/myFile.xml"))).getValue(); Se realiza el mapeo desde el archivo myFile.xml al arbol de objetos. TipoRoot es el elemento raiz del rbol. Cabe destacar, que es necesario realizar el cast a (J AXBElement) y luego aplicar el mtodo getValue() para obtener el elemento de la cl ase TipoRoot, de otra manera no funciona, si bien la documentacin dice lo contrar io. El resto del cdigo es sencillo y se realizan iteraciones sobre los objetos del rbo l. La salida de la ejecucin del programa es la siguiente: Cdigo GeSHi (bash): El apellido es == A-XXX La fecha de nacimiento es == 1981-07-17 El id es == 0 El nombre es == YYY El apellido es == A-YYY La fecha de nacimiento es == 1982-07-17 El id es == 1

********Lista Negocio********** El nombre es == Java El codigo es == 0 El nombre es == Solaris El codigo es == 1 BUILD SUCCESSFUL (total time: 2 seconds) Created by GeSHI 1.0.7.18 El unmarchal sirve para el mapeo de xml hacia un arbol de objetos. Si quieres re alizar el paso contrario deberas crear un objeto marshal. Te dejo un link interes ante, pero en ingles donde existe documentacin sobre JAXB http://java.sun.com/web services/docs/1.6/tutorial/doc/JAXBUsing2.html Espero que este simple ejemplo te sirva, de todas maneras pods seguir preguntando . ;) Saludos Cristian ;D

S-ar putea să vă placă și