Ecco un'altra soluzione, utilizzando XOM library, che compete con my dom4j answer. (Questo è parte del mio quest to find a good dom4j replacement dove XOM è stato suggerito come una opzione.)
Prima leggi il frammento XML in un nu.xom.Document
:
String newNode = "<node>value</node>"; // Convert this to XML
Document newNodeDocument = new Builder().build(newNode, "");
Quindi, ottenere il documento e il Nodo in base al quale si aggiunge il frammento. Anche in questo caso, a scopo di test creerò il documento da una stringa:
Document originalDoc = new Builder().build("<root><given></given></root>", "");
Element givenNode = originalDoc.getRootElement().getFirstChildElement("given");
Ora, aggiunge il nodo figlio è semplice, e simile a quello con dom4j (tranne che XOM non consente di aggiungere l'elemento radice originale che appartiene già alla newNodeDocument
):
givenNode.appendChild(newNodeDocument.getRootElement().copy());
Emissione del documento produce il risultato corretto XML (ed è estremamente semplice con XOM: basta stampare la stringa restituita da originalDoc.toXML()
):
<?xml version="1.0"?>
<root><given><node>value</node></given></root>
(Se si desidera formattare l'XML correttamente (con indentazioni e linefeed), utilizzare uno Serializer
; grazie a Peter Štibraný per averlo indicato.)
Quindi, ammettiamolo, non è molto diverso dalla soluzione dom4j. :) Tuttavia, XOM potrebbe essere un po 'più bello con cui lavorare, perché l'API è meglio documentata e, grazie alla sua filosofia di progettazione, esiste un modo canonico per fare ogni cosa.
Appendice: Anche in questo caso, ecco come convertire tra org.w3c.dom.Document
e nu.xom.Document
. Utilizzare i metodi di supporto nella classe di XOM DOMConverter
:
// w3c -> xom
Document xomDoc = DOMConverter.convert(w3cDoc);
// xom -> w3c
org.w3c.dom.Document w3cDoc = DOMConverter.convert(xomDoc, domImplementation);
// You can get a DOMImplementation instance e.g. from DOMImplementationRegistry
Vedi anche: http://stackoverflow.com/a/7607435/363573 – Stephan