Jeśli chcesz rozpocząć kodowanie Java do XML i XML do Java w mniej niż 5 minut, wypróbuj Simple XML Serialization. Nie trać godzin na naukę interfejsu API JAXB
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Jeśli jednak naprawdę chcesz nauczyć się JAXB, oto doskonały samouczek
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Zawartość poradnika:
JAXB do prostej serializacji Java-XML
Istnieje wiele sposobów serializacji XML w Javie. Jeśli chcesz dokładniejszej kontroli nad analizowaniem i serializacją, możesz wybrać SAX, DOM lub Stax, aby uzyskać lepszą wydajność. Jednak to, co często chcę robić, to proste mapowanie między POJO i XML. Jednak tworzenie klas Java do ręcznego analizowania zdarzeń XML nie jest trywialne. Niedawno odkryłem, że JAXB to szybkie i wygodne mapowanie lub serializacja Java-XML.
JAXB zawiera wiele przydatnych funkcji, możesz sprawdzić implementację referencyjną tutaj. Blog Kohsuke jest również dobrym źródłem informacji o JAXB. W tym wpisie na blogu pokażę, jak wykonać prostą serializację Java-XML za pomocą JAXB.
POJO do XML
Powiedzmy, że mam obiekt Java Item. Chcę serializować obiekt Item do formatu XML. Najpierw muszę dodać do tego POJO kilka adnotacji XML z pakietu javax.xml.bind.annotation. *. Zobacz listę kodu 1 dla Item.java
Z kodu
@XmlRootElement(name="Item")
wskazuje, że chcę być elementem głównym.
@XmlType(propOrder = {"name", "price"})
wskazuje kolejność, w jakiej chcę, aby element był ułożony w danych wyjściowych XML.
@XmlAttribute(name="id", ...)
wskazuje, że id jest atrybutem elementu głównego.
@XmlElement(....)
wskazuje, że chcę, aby cena i nazwa były elementem elementu.
Mój Item.java
jest gotowy. Mogę wtedy przejść dalej i utworzyć skrypt JAXB do organizowania elementu.
//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"));
Aby uzyskać pełną listę kodów, zobacz Listing 2 main.java
. Powstaje item.xml
plik wyjściowy z listą kodów 3 . To wygląda tak:
<?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>
Łatwe, prawda? Możesz alternatywnie skierować wyjściowy kod XML jako tekst String, Stream, Writer, ContentHandler itp., Po prostu zmieniając parametr metody marshal (...), takiej jak
...
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 do POJO
Odwróćmy ten proces. Załóżmy, że mam teraz fragment danych ciągu XML i chcę przekształcić go w obiekt Item.java. Wyglądają jak dane XML (lista kodu 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>
Następnie mogę cofnąć ten kod XML do obiektu Item przez
...
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;
...
Pełną listę kodów można znaleźć na liście kodów 2 (main.java). Źródło XML może przybierać różne formy, zarówno ze strumienia, jak iz pliku. Jedyną różnicą jest ponownie parametr metody:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Walidacja za pomocą schematu XML
Ostatnią rzeczą, o której chcę tutaj wspomnieć, jest walidacja wejściowego XML ze schematem przed cofnięciem korekty do obiektu Java. Tworzę plik schematu XML o nazwie item.xsd. Aby uzyskać pełną listę kodów, zobacz Listing 4 (Item.xsd). Teraz muszę zarejestrować ten schemat do walidacji.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Kiedy próbuję odszukać dane XML do POJO, jeśli wejściowy XML nie jest zgodny ze schematem, zostanie przechwycony wyjątek. Aby uzyskać pełną listę kodów, zobacz Listing 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'.]
Tutaj zmieniam atrybut „id” na ciąg znaków zamiast liczby całkowitej.
Jeśli dane wejściowe XML są zgodne ze schematem, dane XML zostaną pomyślnie cofnięte do obiektu Item.java.