Frage

Ich muss ein XML-Dokument aus einer Java-Objekthierarchie erstellen.Sowohl die Java-Klassen als auch das XML-Format sind festgelegt.Daher kann ich keinen XML-Serialisierer verwenden XStream:Es basiert das XML-Format auf den Java-Klassen.Ebenso eine Java-XML-Bindungstechnologie wie JAXB wird nicht funktionieren, da es Java-Klassen aus dem XML-Schema erstellt [ed:aber siehe unten].Ich brauche einen manuellen Ansatz.

Die Low-Tech-StringBuilder-Route führt zu fragilem und fehlerhaftem Code (zumindest für mich!).

Eine API wie JAXP oder JDOM führt zu viel robusterem Code, aber dieser ist ziemlich ausführlich.

Groovig hat eine elegante 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')
  }
}

Andere Sprachen (z. Rubin) haben noch bessere, obwohl ich bei reinem Java bleiben möchte.Es scheint einige neue XML-Builder für Java zu geben, wie z praktischxml und James Murtys xmlbuilder.

Was sind die eleganteren Ansätze zum Erstellen von XML-Dokumenten in Java?

Zusammenfassung:

Jon Doe schlug vor dom4j Und jdom.

CurtainDog hat trotzdem die Verwendung von JAXB empfohlen, und jherico hat mich darauf hingewiesen, dass dies ein relevanter Vorschlag ist:Sie könnten dann Dozer verwenden, um eine Zuordnung zwischen meinen aktuellen JavaBeans und den JAXB-JavaBeans vorzunehmen.

Thaggie empfiehlt JIBX und stimmte CurtainDog und jherico zu, dass Bindungstechnologien tatsächlich praktisch sind.

StaxMan empfiehlt StaxMate.

Von den Dingen, die ich mir angesehen habe, scheinen Practicalxml und James Murtys XMLbuilder die prägnantesten Builder zu sein, obwohl sie eher neu sind.Die Bindungstechnologien wie JAXB scheinen zusätzliche Sicherheit/Automatisierung zu bieten.Von den Mainstream-Optionen, dom4j Scheint anständig zu sein, wenn auch immer noch etwas ausführlich.Es bietet eine „fließende Schnittstelle“ (Mutatoren geben einen Verweis auf das mutierte Objekt zurück, sodass sie miteinander verkettet werden können), was mir gefällt:

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;
}

Der Einfachheit halber könnten Sie eine dünne Fassade über diese API hüllen, um knappe Synonyme für einige dieser Methoden bereitzustellen (z. B. attr() anstelle von addAttribute()).

Vielen Dank an alle!

P.S.:Stephan Schmidt arbeitete an einem Java MarkupBuilder, scheint es jedoch nicht veröffentlicht zu haben.

War es hilfreich?

Lösung

dom4j oder jdom sind wahrscheinlich die elegantesten, Sie können Code schreiben, wie Sie möchten.Soweit ich mich recht erinnere, hat Dom4j Builder, und ja, der Code ist ausführlicher.

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

Andere Tipps

Schauen Sie mal rein XOM.Es ist schnell, einfach, korrekt und nicht ausführlich.

Warum verwendest du nicht einfach JAXB?dann wird das Problem zu einer sehr einfachen Objekt-zu-Objekt-Zuordnung und Sie vermeiden XML ganz.

Obwohl sie nicht ganz so prägnant sind wie Builder in Skriptsprachen, StaxMate macht die Dinge ganz einfach;Im Allgemeinen so einfach wie Baummodelle strukturell, unterstützt es jedoch zusätzlich typisierte Additionen (implizite Konvertierungen).Und das alles direkt in einem Stream, was eine sehr geringe Speichernutzung (und hohe Geschwindigkeit, wenn das wichtig ist) bedeutet.

Für das, was es wert ist, unterstützt es auch fließenden Stil (ab 2.0.x), da es oft sinnvoll ist.Der Hauptvorteil gegenüber Lösungen mit vollständiger Datenbindung (und Baummodell) ist wahrscheinlich die geringe Speichernutzung.Es bleibt nur sehr wenig Status erhalten, die gesamte Ausgabe wird so schnell wie möglich an das Ziel gesendet.

Möglicherweise können Sie darüber nachdenken JIBX, können Sie möglicherweise eine definieren Kartierung von Ihren Domänenmodellklassen zu Ihrem Ziel-XML-Schema.

Wenn das nicht möglich ist, empfehle ich Ihnen, Ihre Entscheidung noch einmal zu überdenken, obwohl ich weiß, dass Sie angeben, dass Sie bei der Verwendung von Bindungstechnologien Rabatte gewährt haben. Das Kopieren von Ihrem Domänenmodell in ein generiertes Modell führt höchstwahrscheinlich zu einem saubereren, wartbareren und weniger effizienten Ergebnis fehleranfälligerer Code als das, was Sie vorschlagen (was JIBX auch kann).

Ich sollte wahrscheinlich hinzufügen, dass es meiner Erfahrung nach erfolglos ist, hier Fragen zu JIBX zu stellen, aber ihre Mailingliste ist sehr hilfreich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top