Jika Anda ingin mulai mengkode Java ke XML dan XML ke Java dalam waktu kurang dari 5 menit, coba Serialisasi Sederhana XML. Jangan menghabiskan waktu berjam-jam mempelajari JAXB API
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Namun, jika Anda benar-benar tertarik mempelajari JAXB, berikut ini adalah tutorial yang bagus
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Isi tutorial:
JAXB untuk serialisasi Java-XML sederhana
Ada sejumlah cara untuk melakukan serialisasi XML di Jawa. Jika Anda ingin kontrol halus atas parsing dan serialisasi, Anda bisa menggunakan SAX, DOM, atau Stax untuk kinerja yang lebih baik. Namun, yang sering ingin saya lakukan adalah pemetaan sederhana antara POJO dan XML. Namun, membuat kelas Java untuk melakukan parsing acara XML secara manual bukanlah hal sepele. Baru-baru ini saya menemukan JAXB sebagai pemetaan atau serialisasi Java-XML yang cepat dan nyaman.
JAXB berisi banyak fitur yang bermanfaat, Anda dapat melihat implementasi referensi di sini. Blog Kohsuke juga merupakan sumber yang bagus untuk mempelajari lebih lanjut tentang JAXB. Untuk entri blog ini, saya akan menunjukkan kepada Anda bagaimana melakukan serialisasi Java-XML sederhana dengan JAXB.
POJO ke XML
Katakanlah saya memiliki objek Item Java. Saya ingin membuat serial objek untuk format XML. Apa yang harus saya lakukan pertama adalah untuk membubuhi keterangan POJO ini dengan beberapa penjelasan XML dari javax.xml.bind.annotation. * Paket. Lihat daftar kode 1 untuk Item.java
Dari kode
@XmlRootElement(name="Item")
menunjukkan bahwa saya ingin menjadi elemen root.
@XmlType(propOrder = {"name", "price"})
menunjukkan urutan bahwa saya ingin elemen diatur dalam output XML.
@XmlAttribute(name="id", ...)
menunjukkan bahwa id adalah atribut untuk elemen root.
@XmlElement(....)
menunjukkan bahwa saya ingin harga dan nama menjadi elemen dalam Item.
Saya Item.java
siap Saya kemudian dapat melanjutkan dan membuat skrip JAXB untuk mengatur 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"));
Untuk Daftar Kode lengkap silakan lihat Daftar Kode 2 main.java
. File Daftar Kode output 3 item.xml
dibuat. Ini terlihat seperti ini:
<?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>
Mudah bukan? Anda juga dapat menyalurkan output XML sebagai String teks, Stream, Penulis, ContentHandler, dll dengan hanya mengubah parameter metode marshal (...) seperti
...
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 ke POJO
Mari kita balikkan prosesnya. Asumsikan bahwa saya sekarang memiliki sepotong data string XML dan saya ingin mengubahnya menjadi objek Item.java. Data XML (Daftar kode 3) terlihat seperti
<?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>
Saya kemudian dapat menghapus kode xml ini ke objek Item oleh
...
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;
...
Untuk Daftar Kode lengkap silakan lihat Daftar Kode 2 (main.java). Sumber XML dapat datang dalam berbagai bentuk baik dari Stream dan file. Satu-satunya perbedaan, sekali lagi, adalah parameter metode:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Validasi dengan Skema XML
Hal terakhir yang ingin saya sebutkan di sini adalah memvalidasi input XML dengan skema sebelum membatalkan ke objek Java. Saya membuat file skema XML yang disebut item.xsd. Untuk Daftar Kode lengkap silakan lihat Daftar Kode 4 (Item.xsd). Sekarang yang harus saya lakukan adalah mendaftarkan skema ini untuk validasi.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Ketika saya mencoba untuk menghapus data XML ke POJO, jika input XML tidak sesuai dengan skema, pengecualian akan ditangkap. Untuk Daftar Kode lengkap, lihat Daftar Kode 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'.]
Di sini saya mengubah atribut 'id' menjadi string dan bukan bilangan bulat.
Jika input XML valid terhadap skema, data XML tidak akan berhasil untuk objek Item.java berhasil.