web-dev-qa-db-fra.com

Quelle est la meilleure façon de convertir un objet Java en xml avec des API open source

Je me demandais quels sont les meilleurs ou les plus largement utilisés apis pour convertir un Java en xml. Je suis assez nouveau sur le sujet. Y a-t-il une sorte d'appel api que vous pouvez faire pour passer dans un objet et renvoyer du xml? Ou est-ce beaucoup plus fastidieux où que vous ayez besoin de construire le document manuellement en extrayant les valeurs des objets?

J'ai lu sur xerces, sax et jaxb. Je voudrais continuer sur cette voie open source.

Merci!

38
Atma

[~ # ~] jaxb [~ ​​# ~] est définitivement le Solution.

Pourquoi? Eh bien, c'est à l'intérieur du JDK 6 , donc vous ne le trouverez jamais non entretenu.

Il utilise Java annotations pour déclarer les propriétés liées à XML pour les classes, méthodes et champs.

Tutoriel 1

Tutoriel 2

Remarque: JAXB vous permet également de "démarsaler" facilement les données XML (qui ont été précédemment rassemblées de Java instances d'objet) vers des instances d'objet).

Une autre grande chose à propos de JAXB est: il est pris en charge par d'autres technologies liées à Java, telles que JAX-RS (a Java API RESTful, disponible dans le cadre de Java EE 6 ). JAX-RS peut servir et recevoir des objets JAXB à la volée , sans avoir besoin de les rassembler/les désarchiver. Vous voudrez peut-être consulter Netbeans , qui contient un support prêt à l'emploi pour JAX-RS. Lisez ce tutoriel pour commencer.

modifier:

Pour marshall/unmarshall 'random' (ou étranger) Java objets, JAXB offre une possibilité assez simple: on peut déclarer un XmlAdapter et 'envelopper' les classes Java Java compatibles avec JAXB. L'utilisation de ces XmlAdapter se fait en utilisant le @ XmlJavaTypeAdapter -annotation.

55

Vous voudrez peut-être regarder XStream: http://x-stream.github.io

19
Gary Kephart

Disponible avec Java 6 est une API pour convertir des objets annotés Java en XML. Le code suivant montre comment convertir un objet annoté en chaîne XML

final JAXBElement <Type> o = new ObjectFactory (). createElement (new Type ()); 
 
 final Marshaller m = JAXBContext.newInstance (Type.class) .createMarshaller (); 
 
 // Faites cela si vous voulez que le résultat soit plus lisible par l'homme. 
 M.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true); 
 M.marshal (o, System .en dehors);

Vous pouvez étendre cela en ajoutant la validation de schéma (remarque très lente, mais utile pour le débogage)

final JAXBElement <Type> o = new ObjectFactory (). createElement (new Type ()); 
 
 final Marshaller m = JAXBContext.newInstance (Type.class) .createMarshaller (); 
 final Schema schema = SchemaFactory.newInstance (
 "http://www.w3.org/2001/XMLSchema").newSchema(
 getClass (). getResource ("/META-INF /wsdl/schema.xsd"));;.. ________________.modsetSchema(schema) ;;.____.microg.marshal(o, System.out);

Vous n'avez pas besoin de faire une conversion de type en JAXBElement si Type est un élément défini. (c'est-à-dire a une annotation @XmlRootElement)

4
Archimedes Trajano

Pour toute personne qui décide d'utiliser JAXB, assurez-vous de mettre en cache JAXBContext. JAXBContext.newInstance est connu pour être très coûteux. J'ai documenté un cas où la conversion en xml est utilisée dans la journalisation et JAXBContext.newInstance n'est pas mis en cache, cela a provoqué une surcharge de performances jusqu'à 5 secondes lorsqu'elle est invoquée par 20 utilisateurs simultanés.

http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

Cela ne décourage pas quiconque d'utiliser JAXB. Une fois JAXBContext mis en cache, les performances sont excellentes, comme indiqué dans le lien ci-dessus.

3
user1738754

Qu'en est-il de Java.beans.XMLEncoder et Java.beans.XMLDecoder?

Exemple sur http://www.rgagnon.com/javadetails/Java-0470.html

Au revoir.

3
RealHowTo

Il existe de nombreux frameworks open source dans cet espace. Cependant, Simple comme son nom l'indique, est de loin le moyen le plus simple d'effectuer la sérialisation. Jetez un œil au Tutorial . Une autre caractéristique est qu'il peut effectuer une sérialisation polymorphe, ce qui signifie qu'il n'est pas aussi contraint que JAXB par exemple.

1
ng.

XMLBeans en est un autre, similaire à JAXB. Je n'ai pas regardé JAXB depuis un moment, quand je l'ai fait, c'était assez mauvais par rapport à XMLBeans, mais c'était il y a des années (et je préfère utiliser des choses qui sont dans le JDK par opposition à celles de tiers, mais j'utilise toujours XMLBeans à ce jour).

1
TofuBeer