Se você deseja começar a codificar Java para XML e XML para Java em menos de 5 minutos, tente Serialização Simples de XML. Não gaste horas aprendendo a API JAXB
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
No entanto, se você está realmente interessado em aprender JAXB, aqui está um excelente tutorial
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Conteúdo do tutorial:
JAXB para serialização Java-XML simples
Existem várias maneiras de serializar XML em Java. Se você deseja controle refinado sobre análise e serialização, pode optar por SAX, DOM ou Stax para obter melhor desempenho. No entanto, o que geralmente quero fazer é um mapeamento simples entre POJOs e XML. No entanto, a criação de classes Java para fazer a análise de eventos XML manualmente não é trivial. Recentemente, descobri que o JAXB é um mapeamento ou serialização Java-XML rápido e conveniente.
O JAXB contém muitos recursos úteis, você pode conferir a implementação de referência aqui. O Blog de Kohsuke também é um bom recurso para aprender mais sobre o JAXB. Para esta entrada do blog, mostrarei como fazer uma serialização Java-XML simples com JAXB.
POJO para XML
Digamos que eu tenho um objeto Java de item. Eu quero serializar um objeto Item para o formato XML. O que preciso fazer primeiro é anotar este POJO com algumas anotações XML do pacote javax.xml.bind.annotation. *. Veja a listagem de códigos 1 para Item.java
Do código
@XmlRootElement(name="Item")
indica que eu quero ser o elemento raiz.
@XmlType(propOrder = {"name", "price"})
indica a ordem em que desejo que o elemento seja organizado na saída XML.
@XmlAttribute(name="id", ...)
indica que id é um atributo para o elemento raiz.
@XmlElement(....)
indica que eu quero que preço e nome sejam elemento dentro de Item.
Meu Item.java
está pronto. Posso então criar um script JAXB para empacotar Item.
//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 obter a listagem completa de códigos, consulte a Listagem de código 2 main.java
. O item.xml
arquivo de saída da Listagem de Código 3 é criado. Se parece com isso:
<?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 né? Como alternativa, você pode canalizar o XML de saída como texto String, Stream, Writer, ContentHandler, etc, simplesmente alterando o parâmetro do 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 para POJO
Vamos reverter o processo. Suponha que agora eu tenho um pedaço de dados da seqüência XML e desejo transformá-lo no objeto Item.java. Os dados XML (listagem de código 3) parecem
<?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>
Em seguida, posso desselecionar esse código xml para o objeto Item
...
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 obter uma listagem completa de códigos, consulte a Listagem de código 2 (main.java). A fonte XML pode vir de várias formas, tanto do Stream quanto do arquivo. A única diferença, novamente, é o parâmetro do 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);
Validação com esquema XML
A última coisa que quero mencionar aqui é a validação do XML de entrada com o esquema antes de desmontar o objeto Java. Eu crio um arquivo de esquema XML chamado item.xsd. Para obter uma listagem completa de códigos, consulte a Listagem de código 4 (Item.xsd). Agora, o que tenho que fazer é registrar esse esquema para validação.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Quando tento desselecionar dados XML para POJO, se o XML de entrada não estiver em conformidade com o esquema, a exceção será capturada. Para obter uma listagem completa de códigos, consulte a Listagem 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'.]
Aqui eu altero o atributo 'id' para string em vez de inteiro.
Se a entrada XML for válida no esquema, os dados XML serão desassociados para o objeto Item.java com êxito.