Якщо ви хочете розпочати кодування Java в XML та XML на Java менше ніж за 5 хвилин, спробуйте просту серіалізацію XML. Не витрачайте години на вивчення API JAXB
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
Скажімо, у мене є об'єкт 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 для маршалінгу елемента.
//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"));
Повний перелік кодів див. У списку кодів 2 main.java
. item.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>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
Легко так? Ви можете альтернативно каналізувати вихідний XML у вигляді текстового рядка, потоку, Writer, ContentHandler тощо, просто змінивши параметр методу маршала (...), наприклад
...
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>
Потім я можу зняти цей 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;
...
Повний перелік кодів див. У списку кодів 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-схеми
Останнє, що я хочу тут зазначити, - це перевірка вхідного XML зі схемою перед видаленням об'єкта 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
...
Коли я намагаюся знімати дані 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.