Si quieres empezar a programar en Java para XML y XML para Java en menos de 5 minutos, trate de serialización XML simple. No pasar horas aprendiendo la API JAXB http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Sin embargo, si usted 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 Simple Servicación Java-XML
Hay una serie de forma 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 obtener 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 manualmente no es trivial. Recientemente descubrí que JAXB es una asignación o serialización Java-XML rápida y conveniente.
JAXB contiene muchas funciones útiles, puede consultar la implementación de referencia aquí. Kohsuke's Blog es también 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 tiene un objeto de Java artículo. 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. *. Vea el código que enumera 1 para el artículo.java
A partir del código
@XmlRootElement(name="Item")
indica que yo quiero ser el elemento raíz.
@XmlType(propOrder = {"name", "price"})
indica el orden en que quiero que el elemento se organice en salida XML.
@XmlAttribute(name="id", ...)
indica que id es un atributo para el elemento raíz.
@XmlElement(....)
indica que deseo que el precio y el nombre sean elementos dentro del artículo.
Mi Item.java
está listo. Luego puedo seguir 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"));
Por completo listado de código consulte Listado de Código 2 main.java
. Se crea el archivo de código de salida 3 item.xml
. Se ve así:
<?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? Puede canalizar alternativamente el XML de salida como cadena de texto, Arroyo, escritor, ContentHandler, etc simplemente cambiar el parámetro del método Mariscal (...) 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 para POJO
Let de revertir el proceso. Supongamos que ahora tengo una parte de datos de cadena XML y quiero convertirlo en objeto Item.java. datos XML (Listado de Código 3) parece
<?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>
puedo entonces unmarshal el código XML a objeto de artículos 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 código completo consulte Listado de Código 2 (main.java). La fuente XML puede venir en muchas formas tanto de Stream como de archivo. La única diferencia, de nuevo, 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 el esquema XML
Lo último que quiero mencionar aquí es la validación de entrada XML con el esquema antes unmarshalling al objeto Java. Creo un archivo de esquema XML llamado item.xsd. Para obtener el listado completo del código, consulte el Listado de Código 4 (Item.xsd). Ahora lo que tengo que hacer es registrar este esquema para la 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 datos XML unmarshal a POJO, si el XML de entrada no está conforme con el esquema, serán capturados excepción. Para obtener el listado completo del código, consulte el Listado de Código 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 frente al esquema, los datos XML se desmarcarán correctamente al objeto Item.java.
Si quieres generación manual, colocar el archivo .xsd en su proyecto Eclipse, haga clic derecho en el archivo, después haga clic en "generar" –