หากคุณต้องการเริ่มเขียนโค้ด Java เป็น XML และ XML เป็น Java ในเวลาน้อยกว่า 5 นาทีให้ลอง Simple XML Serialization อย่าใช้เวลาหลายชั่วโมงในการเรียนรู้ JAXB API
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
อย่างไรก็ตามหากคุณกระตือรือร้นที่จะเรียนรู้ JAXB จริงๆนี่คือบทช่วยสอนที่ยอดเยี่ยม
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
เนื้อหาของการสอน:
JAXB สำหรับการทำให้เป็นอนุกรม Java-XML อย่างง่าย
มีหลายวิธีในการทำอนุกรม XML ใน Java หากคุณต้องการการควบคุมแบบละเอียดในการแยกวิเคราะห์และการทำให้เป็นอนุกรมคุณสามารถใช้ SAX, DOM หรือ Stax เพื่อประสิทธิภาพที่ดีขึ้น แต่สิ่งที่ฉันมักต้องการทำคือการทำแผนที่อย่างง่ายระหว่าง POJO และ XML อย่างไรก็ตามการสร้างคลาส Java เพื่อทำการแยกวิเคราะห์เหตุการณ์ XML ด้วยตนเองนั้นไม่ใช่เรื่องสำคัญ ฉันเพิ่งพบว่า JAXB เป็นการแมป Java-XML หรือการทำให้เป็นอนุกรมที่สะดวกและรวดเร็ว
JAXB มีคุณสมบัติที่มีประโยชน์มากมายคุณสามารถตรวจสอบการใช้งานอ้างอิงได้ที่นี่ บล็อกของ Kohsukeเป็นแหล่งข้อมูลที่ดีในการเรียนรู้เพิ่มเติมเกี่ยวกับ JAXB สำหรับรายการบล็อกนี้ฉันจะแสดงวิธีการทำซีเรียลไลเซชัน Java-XML อย่างง่ายด้วย JAXB
POJO เป็น XML
สมมติว่าฉันมีวัตถุ Item Java ฉันต้องการทำให้วัตถุ Item เป็นอนุกรมเป็นรูปแบบ XML สิ่งที่ฉันต้องทำก่อนอื่นคือใส่คำอธิบายประกอบ POJO นี้ด้วยคำอธิบายประกอบ XML บางส่วนจากแพ็คเกจ javax.xml.bind.annotation. * ดูรายการรหัส 1 สำหรับ Item.java
จากรหัส
@XmlRootElement(name="Item")
บ่งชี้ว่าฉันต้องการเป็นองค์ประกอบราก
@XmlType(propOrder = {"name", "price"})
ระบุลำดับที่ฉันต้องการให้จัดเรียงองค์ประกอบในเอาต์พุต XML
@XmlAttribute(name="id", ...)
บ่งชี้ว่า id เป็นแอตทริบิวต์ขององค์ประกอบรูท
@XmlElement(....)
บ่งชี้ว่าฉันต้องการให้ราคาและชื่อเป็นองค์ประกอบภายในรายการ
ของฉันItem.java
พร้อมแล้ว จากนั้นฉันสามารถสร้างสคริปต์ JAXB สำหรับ marshaling 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"));
สำหรับรหัสที่สมบูรณ์รายการโปรดดูรายชื่อรหัส main.java
2 item.xml
ไฟล์เอาต์พุต Code Listing 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>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
ง่ายใช่มั้ย? คุณสามารถเปลี่ยนช่อง XML เอาต์พุตเป็นสตริงข้อความ, สตรีม, นักเขียน, ContentHandler และอื่น ๆ ได้โดยเพียงแค่เปลี่ยนพารามิเตอร์ของวิธีการ marshal (... ) เช่น
...
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 เป็น POJO
ลองย้อนกลับกระบวนการ สมมติว่าตอนนี้ฉันมีข้อมูลสตริง XML แล้วและฉันต้องการเปลี่ยนเป็นวัตถุ Item.java ข้อมูล XML (รายการรหัส 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>
จากนั้นฉันสามารถ unmarshal โค้ด xml นี้ไปยังวัตถุ 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;
...
สำหรับรายชื่อโค้ดที่สมบูรณ์โปรดดู Code Listing 2 (main.java) ซอร์ส XML สามารถมาได้หลายรูปแบบทั้งจากสตรีมและไฟล์ ข้อแตกต่างเพียงอย่างเดียวคือพารามิเตอร์วิธีการ:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
การตรวจสอบความถูกต้องด้วย XML Schema
สิ่งสุดท้ายที่ฉันต้องการจะกล่าวถึงที่นี่คือการตรวจสอบความถูกต้องของอินพุต XML ด้วย schema ก่อนที่จะยกเลิกการแชลแนลกับวัตถุ Java ฉันสร้างไฟล์สกีมา XML ชื่อ item.xsd สำหรับรายการรหัสที่สมบูรณ์โปรดดูรายการรหัส 4 (Item.xsd) ตอนนี้สิ่งที่ฉันต้องทำคือลงทะเบียนสคีมานี้เพื่อตรวจสอบความถูกต้อง
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
เมื่อฉันพยายามที่จะ unmarshal ข้อมูล XML ไปยัง POJO หากอินพุต XML ไม่สอดคล้องกับสคีมาข้อยกเว้นจะถูกจับ สำหรับรายชื่อรหัสที่สมบูรณ์โปรดดูรายการรหัส 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'.]
ที่นี่ฉันเปลี่ยนแอตทริบิวต์ "id" เป็นสตริงแทนที่จะเป็นจำนวนเต็ม
หากอินพุต XML ถูกต้องกับสคีมาข้อมูล XML จะถูกแยกออกจากอ็อบเจ็กต์ Item.java สำเร็จ