2008-10-15 19 views
19

Qu'est-ce que vous utilisez pour lier XML à Java? JAXB, Castor et XMLBeans sont quelques-uns des choix disponibles. Les comparaisons que j'ai vues ont toutes trois ou quatre ans. Je suis ouvert à d'autres suggestions. La performance de marchage/unmarshalling et la facilité d'utilisation sont particulièrement intéressantes. Clarification: Je voudrais voir non seulement quel cadre vous utilisez, mais votre raisonnement pour utiliser un sur les autres.Java XML Binding

Répondre

8

JiBX. Précédemment j'ai utilisé Castor XML, mais JiBX s'est avéré être nettement meilleur, notamment en termes de performances (un port rectiligne de code d'application de Castor XML vers JiBX l'a fait 9 fois plus rapide). J'ai aussi trouvé que le format de mapping pour JiBX était plus élégant que celui de Castor.

JiBX atteint ses performances en utilisant la manipulation de post-compilation par code-octet plutôt que l'approche par réflexion adoptée par Castor. Cela a l'avantage de placer moins de demandes sur la façon dont vous écrivez vos classes mappées. Il n'y a pas besoin de getters, de setters et de constructeurs sans argot juste pour satisfaire les outils. La plupart du temps, vous pouvez écrire la classe sans tenir compte des problèmes de mappage, puis la mapper sans modifications.

+0

+1 pour JiBX. Le gros avantage que je vois est la façon dont JiBX semble être utilisé. Bien que la génération de code soit une option, il semble que vous mettiez beaucoup l'accent sur l'écriture de vos propres mappages pour votre propre modèle de données. Tout ce qui m'empêche de gérer les classes générées me rend heureux. J'ai utilisé JiBX pendant quelques années et j'ai adoré. Je ne peux pas dire la même chose pour Castor. :) – spaaarky21

0

Nous utilisons Castor. Cela correspond assez bien à nos besoins.

3

Nous utilisons xstream. Marshalling/unmarshalling est trivial. Voir leur tutorial pour des exemples.

+0

Wahou, ça a l'air plutôt chic! –

+0

Xstream est une technologie de sérialisation xml, pas une technologie de liaison. – johnstok

+0

Oui, la différence entre la sérialisation et la liaison est importante. – erickson

2

Jibx est ce qui est utilisé ici. C'est très rapide, mais les fixations peuvent être un peu compliquées. Cependant, il est particulièrement utile si vous avez des schémas XML décrivant vos objets de domaine, car il est très bien associé à XSD (il existe même un outil bêta XSD2Jibx qui peut prendre des XSD et créer des classes et des mappings de domaine stub que vous pouvez ensuite prendre et coaxer adapter votre modèle de domaine existant).

Il manipule le bytecode, il doit donc être exécuté après la compilation initiale des fichiers Java .class. Vous pouvez utiliser le plugin Maven ou simplement l'utiliser directement (le plugin Eclipse ne semble pas fonctionner pour moi).

2

J'ai utilisé Jaxb avec plus ou moins de succès. À l'époque (il y a quelques années), la documentation générale était terne et la documentation d'utilisation de base (y compris où télécharger les mises en œuvre) était difficile à trouver ou variée.

L'analyseur qui a écrit les classes Java était assez bon avec peu de divergence par rapport à l'original XSD (bien que je pense qu'il avait des problèmes de prise en charge des éléments XML abstraits).

Je ne l'ai pas utilisé depuis, mais j'ai un projet à venir qui nécessitera un tel cadre et je serai intéressé de savoir comment quelqu'un d'autre foires avec ce qui précède.

+0

Semble avoir un certain nombre de bons liens ici: http: // stackoverflow.com/questions/35785/xml-serialization-in-java –

+0

Consultez mon blog pour des exemples de JAXB: http://bdoughan.blogspot.com –

1

J'ai utilisé le castor il y a 7 ans - ça a plutôt bien marché. DTD utilisées. Pas beaucoup de choix à ce moment-là.

Dans les projets en cours, j'ai utilisé
1) JAXB - basé sur les normes, implémentation de référence disponible, ligne de commande et outils de fourmi disponibles. dernière version - 2.1.8 a besoin de Java 5+.
2) XStream - pour Soap unmarshalling - nécessite Java 5+. N'est pas aussi rapide et conforme aux standards que JAXB.

BR,
~ A

12

Si vous souhaitez prendre une décision éclairée, vous devez expliquer pourquoi vous traduisez entre des objets XML et Java.La raison en est que les différentes technologies dans cet espace tentent de résoudre différents problèmes. Les différents outils se divisent en deux catégories:

  1. Liaison de données XML - fait référence au processus de représentation des informations dans un document XML en tant qu'objet dans la mémoire d'un ordinateur. Typiquement, cela signifie définir un XSD et générer un équivalent de code source java. L'interopérabilité entre différentes langues est la priorité absolue (d'où l'utilisation de XSD) - le plus souvent pour l'implémentation de services Web basés sur SOAP.
  2. Sérialisation XML - fait référence à l'écriture d'un graphe d'objets en mémoire dans un flux, afin qu'il puisse être reconstitué quelque part ou un autre jour. Vous écrivez les classes Java à la main; la représentation xml est d'importance secondaire. De plus, le besoin de performance est souvent plus grand et le besoin d'interfonctionnement avec d'autres langages tels que .net est souvent plus faible.

Pour la sérialisation xml, Xstream est difficile à battre. JAXB est la norme pour la liaison XML. Dans les deux cas, si vous utilisez J2EE, vous devrez prêter une attention particulière aux classes extraites de JPA car les proxys de classe et les types de collection spécifiques à la persistance peuvent perturber les outils de liaison/sérialisation.

+0

Merci pour votre contribution. Je suis à la recherche d'une solution contraignante. C'est pour un service Web RESTful avec un XSD existant. Nous utilisons Castor depuis plusieurs années. J'aimerais savoir les raisons pour lesquelles JAXB (ou autre) est meilleur/pire. –

+0

Si vous connaissez au moins XStream, cela vous dérangerait-il de vérifier ma question sur XMLDecoder par rapport à XStream? http://stackoverflow.com/questions/96059/what-are-the-relative-advantages-of-xmlencoder-and-xstream – erickson

4

Si vous avez un XSD pour le XML, et vous n'avez pas besoin de lier les données à un ensemble existant de classes, alors j'aime vraiment XMLBeans. En gros, cela fonctionne comme ceci:

  • Compile XSD
  • Utilisez généré des classes java pour lire/écrire les documents conformes à ce schéma

Reliure un document XML aux classes générées est aussi simple que:

EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile); 
1

XmlBeans est un bon choix, surtout si vous avez des fichiers XSD/WSDL 'cassés'.

Don mentionné

EmployeesDocument empDoc = EmployeesDocument.Factory.parse (xmlFile);

..mais il peut également prendre un nœud, ou un fichier, ou à peu près n'importe quelle source.

Aucun combat avec les espaces de noms, traverse l'objet que vous voulez unmarshall, et Factory.parse.

Souhait Je l'avais trouvé il y a 2 semaines.