Si vous souhaitez commencer à coder Java en XML et XML en Java en moins de 5 minutes, essayez la sérialisation XML simple. Ne passez pas des heures à apprendre l'API JAXB
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Cependant, si vous avez vraiment envie d'apprendre JAXB, voici un excellent tutoriel
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Contenu du tutoriel:
JAXB pour une sérialisation Java-XML simple
Il existe plusieurs façons de procéder à la sérialisation XML en Java. Si vous voulez un contrôle précis de l'analyse et de la sérialisation, vous pouvez opter pour SAX, DOM ou Stax pour de meilleures performances. Pourtant, ce que je veux souvent faire, c'est un simple mappage entre les POJO et XML. Cependant, la création manuelle de classes Java pour analyser manuellement les événements XML n'est pas anodine. J'ai récemment découvert que JAXB était un mappage ou une sérialisation Java-XML rapide et pratique.
JAXB contient de nombreuses fonctionnalités utiles, vous pouvez consulter l'implémentation de référence ici. Le blog de Kohsuke est également une bonne ressource pour en savoir plus sur JAXB. Pour cette entrée de blog, je vais vous montrer comment faire une sérialisation Java-XML simple avec JAXB.
POJO à XML
Disons que j'ai un objet Java Item. Je souhaite sérialiser un objet Item au format XML. Ce que je dois faire d'abord est d'annoter ce POJO avec quelques annotations XML du package javax.xml.bind.annotation. *. Voir la liste de codes 1 pour Item.java
À partir du code
@XmlRootElement(name="Item")
indique que je veux être l'élément racine.
@XmlType(propOrder = {"name", "price"})
indique l'ordre dans lequel je souhaite que l'élément soit organisé dans la sortie XML.
@XmlAttribute(name="id", ...)
indique que id est un attribut de l'élément racine.
@XmlElement(....)
indique que je veux que le prix et le nom soient un élément dans Item.
Mon Item.java
est prêt. Je peux ensuite créer un script JAXB pour le marshaling 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"));
Pour une liste complète des codes, veuillez consulter la liste des codes 2 main.java
. Le item.xml
fichier de sortie Code Listing 3 est créé. Cela ressemble à ceci:
<?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>
Facile non? Vous pouvez également canaliser le XML de sortie sous forme de chaîne de texte, Stream, Writer, ContentHandler, etc. en modifiant simplement le paramètre de la méthode marshal (...) comme
...
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 vers POJO
Inversons le processus. Supposons que j'ai maintenant un morceau de données de chaîne XML et que je veux le transformer en objet Item.java. Les données XML (liste de code 3) ressemblent à
<?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>
Je peux ensuite démarseler ce code xml en objet Item en
...
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;
...
Pour une liste complète des codes, veuillez consulter la liste des codes 2 (main.java). La source XML peut prendre de nombreuses formes à la fois à partir de Stream et de fichier. La seule différence, encore une fois, est le paramètre de méthode:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Validation avec schéma XML
La dernière chose que je veux mentionner ici est la validation du XML d'entrée avec le schéma avant de démarshalling en objet Java. Je crée un fichier de schéma XML appelé item.xsd. Pour une liste complète des codes, veuillez consulter la liste des codes 4 (Item.xsd). Maintenant, ce que je dois faire est d'enregistrer ce schéma pour validation.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Lorsque j'essaye de démarsaliser les données XML en POJO, si le XML d'entrée n'est pas conforme au schéma, une exception sera interceptée. Pour une liste complète des codes, veuillez consulter la liste des codes 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'.]
Ici, je change l'attribut 'id' en chaîne au lieu d'un entier.
Si l'entrée XML est valide par rapport au schéma, les données XML seront supprimées avec succès dans l'objet Item.java.