Se vuoi iniziare a codificare Java in XML e XML in Java in meno di 5 minuti, prova la serializzazione XML semplice. Non perdere ore a imparare l'API JAXB
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Tuttavia, se sei davvero appassionato di apprendimento di JAXB, ecco un eccellente tutorial
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Contenuto del tutorial:
JAXB per una semplice serializzazione Java-XML
Esistono diversi modi per eseguire la serializzazione XML in Java. Se si desidera un controllo accurato sull'analisi e sulla serializzazione, è possibile scegliere SAX, DOM o Stax per prestazioni migliori. Tuttavia, ciò che spesso voglio fare è una semplice mappatura tra POJO e XML. Tuttavia, la creazione di classi Java per eseguire manualmente l'analisi degli eventi XML non è banale. Recentemente ho scoperto che JAXB è una mappatura o serializzazione Java-XML rapida e conveniente.
JAXB contiene molte funzioni utili, puoi controllare l'implementazione di riferimento qui. Il Blog di Kohsuke è anche una buona risorsa per saperne di più su JAXB. Per questo post di blog, ti mostrerò come eseguire una semplice serializzazione Java-XML con JAXB.
POJO a XML
Diciamo che ho un oggetto Java Item. Voglio serializzare un oggetto Item in formato XML. Quello che devo fare prima è annotare questo POJO con alcune annotazioni XML dal pacchetto javax.xml.bind.annotation. *. Vedi il codice 1 per Item.java
Dal codice
@XmlRootElement(name="Item")
indica che voglio essere l'elemento radice.
@XmlType(propOrder = {"name", "price"})
indica l'ordine in cui voglio che l'elemento sia organizzato nell'output XML.
@XmlAttribute(name="id", ...)
indica che id è un attributo all'elemento root.
@XmlElement(....)
indica che voglio che il prezzo e il nome siano elementi all'interno dell'articolo.
Il mio Item.java
è pronto. Posso quindi andare avanti e creare lo script JAXB per il marshalling 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"));
Per l'elenco completo dei codici, vedere l'elenco dei codici 2 main.java
. item.xml
Viene creato il file di output dell'elenco codici 3 . Sembra così:
<?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>
Facile vero? In alternativa, puoi canalizzare l'XML di output come stringa di testo, Stream, Writer, ContentHandler, ecc. Semplicemente cambiando il parametro del metodo marshal (...) come
...
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
Invertire il processo. Supponiamo che ora ho un pezzo di dati stringa XML e voglio trasformarlo in oggetto Item.java. Assomigliano a dati XML (elenco di codici 3)
<?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>
Posso quindi riattivare questo codice XML sull'oggetto Item di
...
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;
...
Per l'elenco completo dei codici, vedere l'elenco dei codici 2 (main.java). Il sorgente XML può venire in molte forme sia da Stream che da file. L'unica differenza, ancora una volta, è il parametro del metodo:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Convalida con schema XML
L'ultima cosa che voglio menzionare qui è la convalida dell'XML di input con lo schema prima di smascherare l'oggetto Java. Creo un file di schema XML chiamato item.xsd. Per l'elenco completo dei codici, vedere l'elenco dei codici 4 (Item.xsd). Ora quello che devo fare è registrare questo schema per la convalida.
...
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 provo a ripristinare i dati XML su POJO, se l'XML di input non è conforme allo schema, verrà rilevata un'eccezione. Per l'elenco completo dei codici, vedere l'elenco dei codici 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'.]
Qui cambio l'attributo 'id' in stringa anziché in intero.
Se l'input XML è valido contro lo schema, i dati XML verranno smascherati correttamente sull'oggetto Item.java.