Ho bisogno di creare un documento XML da una gerarchia di oggetti Java. Sia le classi Java che il formato XML sono corretti. Quindi non posso usare un serializzatore XML come XStream: basa il formato XML sulle classi Java. Allo stesso modo, una tecnologia di collegamento XML Java come JAXB non funzionerà, dal momento che crea classi Java dallo schema XML [ed: ma vedi sotto]. Ho bisogno di un approccio manuale.Come creare in modo conciso un documento XML in Java?
Il percorso StringBuilder a bassa tecnologia genera codice fragile e buggato (almeno per me!).
Un'API come JAXP o JDOM porta a codice molto più robusto, ma questi sono piuttosto prolissi.
Groovy ha un 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')
}
}
Altre lingue (es. Ruby) hanno quelli ancora migliori, se io voglio stare con Java puro. Sembrano esserci alcuni nuovi builder XML per Java, come ad esempio practicalxml e James Murty's xmlbuilder.
Quali sono gli approcci più eleganti per la creazione di documenti XML in Java?
Sommario:
Jon Doe suggerito dom4j e jdom.
CurtainDog ha raccomandato comunque l'uso di JAXB e Jherico mi ha suggerito che si trattava di un suggerimento pertinente: era quindi possibile utilizzare Dozer per eseguire il mapping tra i miei attuali JavaBeans e JAXB JavaBeans.
thaggie consiglia JIBX e concordato con CurtainDog e jherico che le tecnologie vincolanti sono effettivamente pratiche.
StaxMan raccomanda StaxMate.
Delle cose che ho visto, il pratico xml e l'xml builder di James Murty sembrano essere i costruttori più concisi, anche se sono piuttosto nuovi. Le tecnologie di binding come JAXB sembrano offrire sicurezza/automazione extra. Delle scelte tradizionali, dom4j sembra decente, sebbene sia ancora un po 'prolisso. Esso offre una "interfaccia fluida" (mutatori restituiscono un riferimento all'oggetto mutato in modo che possano essere concatenati), che mi piace:
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;
}
Per brevità, si potrebbe avvolgere una facciata sottile sopra questa API per fornire laconico sinonimi per alcuni di questi metodi (ad es. attr() invece di addAttribute()).
Grazie a tutti!
P.S .: Stephan Schmidt ha lavorato su un Java MarkupBuilder, anche se sembra non averlo pubblicato.
Si prega di correggere il collegamento dom4j a http://dom4j.sourceforge.net/ :) –
@PawelVeselov - grazie, è triste come dom4j.org è stato cooptato. –
(O/T) @JimFerrans Non penso che sia stato cooptato, semplicemente non citano più il software dom4j. Lo stile della pagina tra loro e la pagina della libreria dom4j è troppo simile per quei ragazzi che non hanno lo stesso tetto :) –