Saltar al contenido

¿Generar clases Java a partir de archivos .XSD…?

Si te encuentras con algún detalle que no entiendes puedes comentarlo y te responderemos lo mas rápido que podamos.

Solución:

JAXB hace EXACTAMENTE lo que quieres. Está integrado en JRE/JDK a partir de 1.6

Para ampliar los comentarios de “usar JAXB” anteriores,

en ventanas
"%java_home%binxjc" -p [your namespace] [xsd_file].xsd

p.ej,
"%java_home%binxjc" -p com.mycompany.quickbooks.obj quickbooks.xsd

Espere un poco, y si tenía un archivo XSD bien formado, obtendrá algunas clases de Java bien formadas

Si desea comenzar a codificar Java a XML y XML a Java en menos de 5 minutos, pruebe la serialización XML simple. No pase horas aprendiendo la API de JAXB http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

Sin embargo, si está realmente interesado en aprender JAXB, aquí hay un excelente tutorial http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

Contenido del tutorial:

JAXB para serialización Java-XML simple

Hay varias formas de realizar la serialización XML en Java. Si desea un control detallado sobre el análisis y la serialización, puede optar por SAX, DOM o Stax para un mejor rendimiento. Sin embargo, lo que a menudo quiero hacer es un mapeo simple entre POJO y XML. Sin embargo, la creación de clases Java para realizar el análisis manual de eventos XML no es trivial. Recientemente descubrí que JAXB es un mapeo o serialización Java-XML rápido y conveniente.

JAXB contiene muchas características útiles, puede consultar la implementación de referencia aquí. El blog de Kohsuke también es un buen recurso para obtener más información sobre JAXB. Para esta entrada de blog, le mostraré cómo hacer una serialización Java-XML simple con JAXB.

POJO a XML

Digamos que tengo un objeto Item Java. Quiero serializar un objeto Item en formato XML. Lo que tengo que hacer primero es anotar este POJO con algunas anotaciones XML del paquete javax.xml.bind.annotation.*. Consulte el listado de código 1 para Item.java

del codigo

  • @XmlRootElement(name="Item") indica que quiero ser el elemento raíz.
  • @XmlType(propOrder = "name", "price") indica el orden en que quiero que se organice el elemento en la salida XML.
  • @XmlAttribute(name="id", ...) indica que id es un attribute al elemento raíz.
  • @XmlElement(....) indica que quiero que el precio y el nombre sean elementos dentro del Artículo.

Mi Item.java está listo. Luego puedo seguir adelante y crear un script JAXB para ordenar el artículo.

//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....

JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));

Para ver el listado de códigos completo, consulte el listado de códigos 2 main.java. El listado de códigos de salida 3 item.xml se crea el archivo. Se parece a esto:



  Foo
  200

¿Fácil verdad? Alternativamente, puede canalizar el XML de salida como Cadena de texto, Stream, Writer, ContentHandler, etc. simplemente cambiando el parámetro del método marshal (…) como

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, );

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);

XML a POJO

Invirtamos el proceso. Supongamos que ahora tengo una pieza de XML string data y quiero convertirlo en un objeto Item.java. Los datos XML (listado de código 3) se ven como



  Bar
  80

Luego puedo descomponer este código xml en el objeto Item por

...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...

Para ver el listado de códigos completo, consulte el listado de códigos 2 (main.java). La fuente XML puede venir en muchas formas tanto de Stream como de archivo. La única diferencia, nuevamente, es el parámetro del método:

...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);

Validación con Esquema XML

Lo último que quiero mencionar aquí es validar el XML de entrada con el esquema antes de desarmarlo al objeto Java. Creo un archivo de esquema XML llamado item.xsd. Para ver el listado de códigos completo, consulte el listado de códigos 4 (artículo.xsd). Ahora lo que tengo que hacer es registrar este esquema para su validación.

...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...

Cuando trato de descomponer los datos XML en POJO, si el XML de entrada no se ajusta al esquema, se detectará una excepción. Para ver el listado de códigos completo, consulte el listado de códigos 5 (invalid_item.xml).

javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
                                not a valid value for 'integer'.]

Aquí cambio el ‘id’ attribute para string en lugar de entero.

Si la entrada XML es válida con respecto al esquema, los datos XML se descompondrán correctamente en el objeto Item.java.

Aquí tienes las reseñas y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *