Если вы хотите начать кодирование 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
Допустим, у меня есть объект Java Item. Я хочу сериализовать объект 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.
Моя Item.java
готова. Затем я могу продолжить и создать сценарий JAXB для маршалинга 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"));
Полный листинг кода см. В листинге 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 и т.д., просто изменив параметр метода 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>
Затем я могу демаршалировать этот 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.