Question

Je dois créer un document XML à partir d'une hiérarchie d'objets Java. Les classes Java et le format XML sont fixes. Je ne peux donc pas utiliser un sérialiseur XML comme XStream : il fonde le format XML sur les classes Java. De même, une technologie de liaison Java XML telle que JAXB ne fonctionnera pas, car elle crée des classes Java à partir du schéma XML [ ed: mais voir ci-dessous]. J'ai besoin d'une approche manuelle.

L'itinéraire low-tech de StringBuilder génère un code fragile et buggy (du moins pour moi!).

Une API telle que JAXP ou JDOM conduit à un code beaucoup plus robuste, mais ils sont plutôt verbeux.

Groovy a un élégant MarkupBuilder :

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
  car(name:'HSV Maloo', make:'Holden', year:2006) {
    country('Australia')
    record(type:'speed', 'Production Pickup Truck with speed of 271kph')
  }
  car(name:'P50', make:'Peel', year:1962) {
    country('Isle of Man')
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg')
  }
}

D'autres langues (par exemple, Ruby ) sont encore meilleures, bien que je souhaite rester en Java pur. Il semble exister de nouveaux générateurs XML pour Java, tels que Practicalxml et xmlbuilder .

Quelles sont les approches les plus élégantes pour la construction de documents XML en Java?

Résumé:

Jon Doe a suggéré dom4j et jdom .

CurtainDog a quand même recommandé d’utiliser JAXB, et jherico m’a indiqué que c’était une suggestion pertinente: vous pouvez ensuite utiliser Dozer pour mapper mes JavaBeans actuels à ceux de JAXB.

thaggie recommande JIBX et convient avec CurtainDog et Jherico que les technologies de reliure sont réellement pratiques.

StaxMan recommande StaxMate .

De ce que j'ai vu, Practicalxml et xmlbuilder de James Murty semblent être les constructeurs les plus concis, bien qu'ils soient plutôt novateurs. Les technologies de reliure telles que JAXB semblent offrir une sécurité / automatisation supplémentaire. Parmi les choix courants, dom4j semble correct, même s'il reste assez prolixe. Il offre une "interface fluide". (les mutateurs renvoient une référence à l'objet muté pour pouvoir les chaîner), ce que j'aime bien:

public Document createDocument() {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement( "root" );
    Element author2 = root.addElement( "author" )
      .addAttribute( "name", "Toby" )
      .addAttribute( "location", "Germany" )
      .addText( "Tobias Rademacher" );
    Element author1 = root.addElement( "author" )
      .addAttribute( "name", "James" )
      .addAttribute( "location", "UK" )
      .addText( "James Strachan" );
    return document;
}

Par souci de concision, vous pouvez placer une façade mince sur cette API pour fournir des synonymes succincts pour certaines de ces méthodes (par exemple, attr () au lieu de addAttribute ()).

Merci à tous!

PS: Stephan Schmidt a travaillé sur un MarkupBuilder , mais semble ne pas l'avoir publiée.

Était-ce utile?

La solution

dom4j ou jdom sont probablement les plus élégants, vous pouvez écrire du code comme vous le souhaitez. Si je me souviens bien, Dom4j a des constructeurs, et oui le code est plus détaillé.

Element.addElement("x").setAttribute("x", "y").xxxxx;

Autres conseils

Consultez XOM . C'est rapide, simple, correct et non bavard.

Pourquoi n'utilisez-vous pas simplement JAXB de toute façon ... le problème devient alors un objet très simple de mappage d'objet et vous évitez complètement xml.

Bien que pas aussi concis que les développeurs de langages de script, StaxMate simplifie les choses; généralement aussi simple que des modèles arborescents de manière structurelle, mais il prend également en charge l’addition typée (conversions implicites). Et tout cela directement dans un flux, ce qui signifie une très faible utilisation de la mémoire (et une vitesse élevée si cela compte).

Pour sa valeur, il prend également en charge un style fluide (à partir de la version 2.0.x), car il a souvent un sens. Le principal avantage des solutions de liaison totale des données (et du modèle arborescent) est probablement une faible utilisation de la mémoire. très peu d’état est conservé, toutes les sorties sont envoyées à destination dès que possible.

Vous pourrez peut-être envisager JIBX de définir un mappage de vos classes de modèle de domaine vers votre schéma XML cible.

Sinon, si cela n’est pas possible, même si je sais que vous déclarez que vous n’avez pas utilisé les technologies de reliure, je vous encourage à revoir cette décision. La copie de votre modèle de domaine dans un modèle généré rendra probablement plus propre, plus propre. le code maintenable et moins sujet aux erreurs que ce que vous proposez (ce que JIBX peut également faire).

Je devrais probablement ajouter que, selon mon expérience, poser des questions sur JIBX est infructueux, mais sa liste de diffusion est très utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top