Java Neues Root Element in XML erzeugen

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.100
Hi,

habe ein XML-Dokument, welches ein neues Root element erhalten soll. Dazu erstelle eich ein Document um ein bestehendes xml file auszulesen und nehme ein paar änderungen vor.

Anschließend muss ich ein neues root element und und ein weiteres Element einfügen, in das das bestehende xml-dokument rein muss.

ein neues root direkt anlegen geht glaube ich nicht. jetzt habe ich ein neues leeres dokument erzeugt, dort die neuen elemente eingefügt und nun muss noch das bestehende xmlfile mit eingefügt werden. jedoch erhalte ich bei dem Versuch immer folgende Meldung:
WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it

Hier noch ein bisschen Code:
Code:
	            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	            DocumentBuilder builder = factory.newDocumentBuilder();
	            Document document = builder.parse(XMLFILENAME);
	            
	            String newContent;
	            String elementAttribut;
	            
	            Document newXml = builder.newDocument();
	            
	            /**
	             * Neu einzufügende Elemente erzeugen
	             */
	            Element stylesheet = newXml.createElement("xsl:stylesheet");
	            Element output = newXml.createElement("xsl:output");
	            Element template = newXml.createElement("xsl:template");
	            
	            //Neues root Node
	            //Element root = newXml.createElement(d);
	            newXml.appendChild(stylesheet);      
	            newXml.getElementsByTagName("xsl:stylesheet").item(0).appendChild(output);
	            newXml.getElementsByTagName("xsl:stylesheet").item(0).appendChild(template);
	            newXml.getElementsByTagName("xsl:template").item(0).appendChild(document);
 
Erst einmal kannst du nur ein Root-Element haben!

Zudem kannst du in einem Baum auch bestehende Elemente ersetzen:

Code:
newXml.replaceChild(newChild, oldChild);
Zudem bekommst du die Fehlermeldung, weil das Knoten weiß von welchem Dokument dieser erzeugt wurde.

Entweder du klonst oder fügst ihm mit entsprechner Funktion ein:

Code:
newXml.importNode(node, true);
Code:
Node n = template.cloneNode(true);
Ich denke das sollte dir soweit erst einmal helfen!
 
danke für deine Hilfe. Ich habe es jetzt mit Hilfe von replaceChild hinbekommen. Das rootelement clone ich vorher und füge es später als child wieder ein.

mit import und clone des documentes hat es leider nicht geklappt aber ich denke gegen die oben genannte Lösung ist auch nichts einzuwenden
 
Du brauchst das XML-Dokument im Speicher nicht mehr dublizieren, Lösung sollte wie folgt aussehen:

Code:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(XMLFILENAME);

Node nodeOldStylesheet = document.getElementsByTagName("xsl:stylesheet").item(0);
Node nodeOldOutput = document.getElementsByTagName("xsl:output").item(0);
Node nodeOldTemplate = document.getElementsByTagName("xsl:template").item(0);

Node nodeNewStylesheet = document.createElement("xsl:stylesheet");
Node nodeNewOutput = document.createElement("xsl:output");
Node nodeNewTemplate = document.createElement("xsl:template");

document.replaceChild(nodeOldStylesheet, nodeNewStylesheet);
document.replaceChild(nodeOldOutput, nodeNewOutput);
document.replaceChild(nodeOldTemplate, nodeNewTemplate);

Anschließend brauchst du das Dokument nurnoch rausschreiben!
 
Zurück
Oben