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 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 la serialización simple de Java-XML
Hay varias maneras de hacer 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 de eventos XML de forma manual no es trivial. Recientemente encontré 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 aprender más sobre JAXB. Para esta entrada de blog, le mostraré cómo hacer una simple serialización Java-XML con JAXB.
POJO a XML
Digamos que tengo un objeto Item Java. Quiero serializar un objeto Item a 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ódigos 1 para Item.java
Del código
@XmlRootElement(name="Item")
indica que quiero ser el elemento raíz.
@XmlType(propOrder = {"name", "price"})
indica el orden en que quiero que el elemento se organice en la salida XML.
@XmlAttribute(name="id", ...)
indica que id es un atributo del elemento raíz.
@XmlElement(....)
indica que quiero que el precio y el nombre sean elementos dentro del artículo.
Mi Item.java
esta listo. Luego puedo seguir adelante y crear un script JAXB para el artículo de cálculo de referencias.
//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 obtener una lista completa de códigos, consulte la Lista de códigos 2 main.java
. Se item.xml
crea el archivo de salida del Listado de códigos 3 . Se parece a esto:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
Fácil verdad? Alternativamente, puede canalizar el XML de salida como String 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, <java.io.OutputStream instance>);
...
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
Vamos a revertir el proceso. Suponga que ahora tengo un fragmento de datos de cadena XML y quiero convertirlo en objeto Item.java. Los datos XML (Listado de código 3) se ven como
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>
Entonces puedo deshacer este código xml al 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 obtener una lista completa de códigos, consulte la Lista 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 desarmar al objeto Java. Creo un archivo de esquema XML llamado item.xsd. Para obtener una lista completa de códigos, consulte la Lista de códigos 4 (Item.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 intento descomponer datos XML en POJO, si el XML de entrada no se ajusta al esquema, se detectará una excepción. Para obtener una lista completa de códigos, consulte la Lista 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 atributo 'id' a cadena en lugar de entero.
Si la entrada XML es válida contra el esquema, los datos XML se desarmarán al objeto Item.java con éxito.