Nếu bạn muốn bắt đầu mã hóa Java thành XML và XML sang Java trong chưa đầy 5 phút, hãy thử Tuần tự hóa XML đơn giản. Đừng dành hàng giờ để học API JAXB
http://simple.sourceforge.net/doad/stream/doc/tutorial/tutorial.php
Tuy nhiên, nếu bạn thực sự quan tâm đến việc học JAXB, thì đây là một hướng dẫn tuyệt vời
http://bloss.oracle.com/teera/entry/jaxb_for_simple_java_xml
Nội dung hướng dẫn:
JAXB để tuần tự hóa Java-XML đơn giản
Có một số cách để thực hiện tuần tự hóa XML trong Java. Nếu bạn muốn kiểm soát chi tiết về phân tích cú pháp và tuần tự hóa, bạn có thể sử dụng SAX, DOM hoặc Stax để có hiệu suất tốt hơn. Tuy nhiên, điều tôi thường muốn làm là ánh xạ đơn giản giữa POJO và XML. Tuy nhiên, việc tạo các lớp Java để thực hiện phân tích cú pháp sự kiện bằng tay không phải là chuyện nhỏ. Gần đây tôi đã tìm thấy JAXB là một ánh xạ hoặc tuần tự hóa Java-XML nhanh chóng và thuận tiện.
JAXB chứa rất nhiều tính năng hữu ích, bạn có thể kiểm tra việc triển khai tham khảo tại đây. Blog của Kohsuke cũng là một tài nguyên tốt để tìm hiểu thêm về JAXB. Đối với mục blog này, tôi sẽ chỉ cho bạn cách thực hiện tuần tự hóa Java-XML đơn giản với JAXB.
POJO sang XML
Giả sử tôi có một đối tượng Java Item. Tôi muốn tuần tự hóa một đối tượng Item thành định dạng XML. Điều tôi phải làm trước tiên là chú thích POJO này với một vài chú thích XML từ gói javax.xml.bind.annotation. *. Xem danh sách mã 1 cho Item.java
Từ mã
@XmlRootElement(name="Item")
chỉ ra rằng tôi muốn là thành phần gốc.
@XmlType(propOrder = {"name", "price"})
chỉ ra thứ tự mà tôi muốn phần tử được sắp xếp trong đầu ra XML.
@XmlAttribute(name="id", ...)
chỉ ra rằng id là một thuộc tính cho phần tử gốc.
@XmlElement(....)
chỉ ra rằng tôi muốn giá và tên là thành phần trong Mục.
Tôi Item.java
đã sẵn sàng. Sau đó tôi có thể tiếp tục và tạo tập lệnh JAXB cho mục sắp xếp thứ tự.
//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"));
Để biết mã hoàn chỉnh, vui lòng xem Mã Liệt kê 2 main.java
. Tệp Mã đầu ra 3 item.xml
được tạo. Nó trông như thế này:
<?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>
Dễ dàng phải không? Bạn có thể thay thế kênh XML đầu ra dưới dạng chuỗi văn bản, Luồng, Trình ghi, ContentHandler, v.v. bằng cách đơn giản thay đổi tham số của phương thức marshal (...) như
...
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 sang POJO
Hãy đảo ngược quá trình. Giả sử rằng bây giờ tôi có một phần dữ liệu chuỗi XML và tôi muốn biến nó thành đối tượng Item.java. Dữ liệu XML (Mã liệt kê 3) trông giống như
<?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>
Sau đó tôi có thể sắp xếp mã xml này thành đối tượng Item bằng cách
...
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;
...
Để biết mã hoàn chỉnh, vui lòng xem Mã Liệt kê 2 (main.java). Nguồn XML có thể có nhiều dạng từ cả Stream và file. Sự khác biệt duy nhất, một lần nữa, là tham số phương thức:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Xác thực với Lược đồ XML
Điều cuối cùng tôi muốn đề cập ở đây là xác thực XML đầu vào bằng lược đồ trước khi sắp xếp lại đối tượng Java. Tôi tạo một tệp lược đồ XML có tên là item.xsd. Để biết mã hoàn chỉnh, vui lòng xem Mã Liệt kê 4 (Item.xsd). Bây giờ những gì tôi phải làm là đăng ký lược đồ này để xác nhậ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
...
Khi tôi cố gắng sắp xếp dữ liệu XML thành POJO, nếu XML đầu vào không tuân theo lược đồ, ngoại lệ sẽ bị bắt. Để biết mã hoàn chỉnh, vui lòng xem Mã liệt kê 5 (không hợp lệ).
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'.]
Ở đây tôi thay đổi thuộc tính 'id' thành chuỗi thay vì số nguyên.
Nếu đầu vào XML hợp lệ với lược đồ, dữ liệu XML sẽ được sắp xếp thành công đối tượng Item.java.