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-Serializer wie XStream verwenden: Er basiert das XML-Format auf den Java-Klassen. Ebenso funktioniert eine Java-XML-Bindungstechnologie wie JAXB nicht, da sie Java-Klassen aus dem XML-Schema erstellt [ed: aber siehe unten]. Ich brauche einen manuellen Ansatz.Wie erstellt man ein XML-Dokument in Java präzise?
Die Low-Tech-StringBuilder-Route führt zu fragilen und fehlerhaften Code (zumindest für mich!).
Eine API wie JAXP oder JDOM führt zu viel robuster Code, aber diese sind ziemlich ausführlich.
Groovy hat ein elegantes 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 (. ZB Ruby) haben noch bessere, obwohl ich mit reinem Java bleiben wollen. Es scheint einige neue XML-Builder für Java zu geben, wie practicalxml und James Murtys xmlbuilder.
Was sind die eleganteren Ansätze zum Erstellen von XML-Dokumenten in Java?
Zusammenfassung:
Jon Doe vorgeschlagen dom4j und jdom.
CurtainDog wurde trotzdem mit JAXB empfohlen, und jherico hat mich darauf hingewiesen, dass dies ein interessanter Vorschlag war: Sie könnten dann Dozer verwenden, um zwischen meinen aktuellen JavaBeans und den JAXB JavaBeans zu mappen.
taggie empfiehlt JIBX und stimmte mit CurtainDog und jherico überein, dass verbindliche Technologien tatsächlich praktisch sind.
StaxMan empfiehlt StaxMate.
Von den Sachen, die ich mir angesehen habe, scheinen practicalxml und James Murtys xmlbuilder die kompaktesten Erbauer zu sein, obwohl sie ziemlich neu sind. Die Bindungstechnologien wie JAXB scheinen zusätzliche Sicherheit/Automatisierung zu bieten. Von den Mainstream-Optionen scheint dom4j anständig, aber immer noch irgendwie ausführlich. Es bietet eine „Fluent Interface“ (Mutatoren einen Verweis auf das mutierte Objekt zurück, so dass sie miteinander verkettet werden), die Ich mag:
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;
}
Für Prägnanz Sie eine dünne Fassade über diese API wickeln könnte kurz und bündig zu schaffen Synonyme für einige dieser Methoden (zB attr() anstelle von addAttribute()).
Vielen Dank!
P.S .: Stephan Schmidt arbeitete an einem Java MarkupBuilder, scheint es aber nicht veröffentlicht zu haben.
Bitte reparieren dom4j Link zu http://dom4j.sourceforge.net/ :) –
@PawelVeselov - danke, es ist traurig, wie dom4j.org koopted wurde. –
(O/T) @JimFerrans Ich glaube nicht, dass es kooptiert wurde, sie erwähnen die dom4j-Software einfach nicht mehr. Das Seitenstyling zwischen ihnen und der dom4j-Bibliotheksseite ist zu ähnlich für die Leute, die nicht das gleiche Dach haben :) –