Wenn Sie Java in XML und XML in Java in weniger als 5 Minuten codieren möchten, versuchen Sie es mit Simple XML Serialization. Verbringen Sie keine Stunden damit, die JAXB-API http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php zu lernen
Wenn Sie jedoch wirklich JAXB lernen möchten, finden Sie hier ein hervorragendes Tutorial
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Inhalt des Tutorials:
JAXB für die einfache Java-XML-Serialisierung
Es gibt verschiedene Möglichkeiten, XML-Serialisierung in Java durchzuführen. Wenn Sie eine genauere Kontrolle über das Parsen und die Serialisierung wünschen, können Sie sich für eine bessere Leistung für SAX, DOM oder Stax entscheiden. Was ich jedoch oft tun möchte, ist eine einfache Zuordnung zwischen POJOs und XML. Das Erstellen von Java-Klassen für die manuelle Analyse von XML-Ereignissen ist jedoch nicht trivial. Ich habe kürzlich festgestellt, dass JAXB eine schnelle und bequeme Java-XML-Zuordnung oder -Serialisierung ist.
JAXB enthält viele nützliche Funktionen. Die Referenzimplementierung finden Sie hier. Kohsukes Blog ist auch eine gute Quelle, um mehr über JAXB zu erfahren. In diesem Blogeintrag zeige ich Ihnen, wie Sie mit JAXB eine einfache Java-XML-Serialisierung durchführen.
POJO zu XML
Angenommen, ich habe ein Item-Java-Objekt. Ich möchte ein Item-Objekt im XML-Format serialisieren. Was ich zuerst tun muss, ist, dieses POJO mit ein paar XML-Anmerkungen aus dem Paket javax.xml.bind.annotation. * Zu versehen. Siehe Codeliste 1 für Item.java
Aus dem Code
@XmlRootElement(name="Item")
zeigt an, dass ich das Wurzelelement sein möchte.
@XmlType(propOrder = {"name", "price"})
Gibt die Reihenfolge an, in der das Element in der XML-Ausgabe angeordnet werden soll.
@XmlAttribute(name="id", ...)
Gibt an, dass id ein Attribut für das Stammelement ist.
@XmlElement(....)
gibt an, dass Preis und Name Element innerhalb von Artikel sein sollen.
Mein Item.java
ist bereit. Ich kann dann ein JAXB-Skript für das Marshalling von Item erstellen.
//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"));
Eine vollständige Codeliste finden Sie unter Codeliste 2 main.java
. Die Ausgabecode Listing 3- item.xml
Datei wird erstellt. Es sieht aus wie das:
<?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>
Einfach richtig? Sie können das Ausgabe-XML alternativ als Textzeichenfolge, Stream, Writer, ContentHandler usw. kanalisieren, indem Sie einfach den Parameter der Marshal-Methode (...) wie ändern
...
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 zu POJO
Lassen Sie uns den Prozess umkehren. Angenommen, ich habe jetzt ein Stück XML-Zeichenfolgendaten und möchte es in ein Item.java-Objekt umwandeln. XML-Daten (Codeauflistung 3) sehen aus wie
<?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>
Ich kann dann diesen XML-Code für das Item-Objekt von dem Marshall entfernen
...
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;
...
Eine vollständige Codeliste finden Sie in Codeliste 2 (main.java). Die XML-Quelle kann in vielen Formen sowohl aus Stream als auch aus Datei vorliegen. Der einzige Unterschied ist wiederum der Methodenparameter:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Validierung mit XML-Schema
Das Letzte, was ich hier erwähnen möchte, ist die Überprüfung der Eingabe-XML mit dem Schema, bevor die Bereitstellung für das Java-Objekt aufgehoben wird. Ich erstelle eine XML-Schemadatei mit dem Namen item.xsd. Eine vollständige Codeliste finden Sie in Codeliste 4 (Item.xsd). Jetzt muss ich dieses Schema zur Validierung registrieren.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Wenn ich versuche, XML-Daten für POJO zu entmarschieren, wird eine Ausnahme abgefangen, wenn die Eingabe-XML nicht dem Schema entspricht. Eine vollständige Codeliste finden Sie in Codeliste 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'.]
Hier ändere ich das Attribut 'id' in string anstelle von integer.
Wenn die XML-Eingabe für das Schema gültig ist, werden die XML-Daten erfolgreich für das Item.java-Objekt freigegeben.