XML Document lesen und in eine anderes einfügen

Supa

Erfahrenes Mitglied
Hy,

ich möchte Ein XML-Dokument (test.xml) lesen und an einer bestimmten Stelle (include-Node) eine Node durch ein anderes XML-Dokument (include1.xml) ersetzen. Also quasi ein "XML-in-XML-Include".

die Beispiel Dokumente sehn wie folgt aus:

test.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<buch>
	<chapter>
		<page no="1">
			Hier steht Text...
		</page>
	</chapter>
	<include value="include1.xml" /><!-- "value" bewirkt hier natürlich noch nichts-->
</buch>

include.xml:
Code:
<chapter>
	<page no="2">
		Hier steht noch mehr Text...
	</page>
</chapter>


Ich hatte mir das in etwa so vorgestellt:
Code:
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class Test {
	public static void main(String[] args) {
		try {
		    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		    Document doc1 = parser.parse(new File("test.xml"));
		    Document doc2 = parser.parse(new File("include1.xml"));

		    doc1.replaceChild(doc2, doc1.getElementById("include"));
		} catch (Exception e) {e.printStackTrace();}
	}
}

aber dann wird folgende Exception geworfen:
Code:
org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.

Offensichtlich können Nodes aus verschiedenen Dokumenten nicht zusammen in ein Dokument gefügt werden. Warum geht das nicht? Und was gäbe es für eine Alternative?

mfg Supa
 
Also ich habe jetzt zwar keinen konkreten Java-Code für dich parat, aber das kann man sicher wie folgt lösen:

1) Du gehst in der test.xml Datei alle childNodes des RootNodes durch, wenn der NodeName = include ist, löscht du diesen Node mal aus dem XML File

2) Du erstellst einen neuen Knoten namen include

3) Lest die andere xml Datei namens include.xml ein, speicherst dir den RootNode auf einer Variable.

4) Du gehst nun alle ChildNodes des RootNodes durch und fügst sie dem vorher neu erstellten include-Knoten an.

So geht es auf jedenfall. Da ich mich mit jdom allerdings zugegebenermaßen noch nicht allzuviel gearbeitet habe, gibt es ev. auch eine andere elegantere Lösung?

Wenn du noch Probleme oder Fragen hast, kannst du dich gerne nochmals bei mir melden!

Gruß,
Harry
 
Moin,

Danke für die Antwort. Ich habs jetzt mit jdom gemacht.
Mein erster Versuch war ja mehr so ne Mischung aus Packages die nicht so richtig zusammen passen -.-
Code:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

Für alle die's interessiert, meine Lösung sieht jetzt wie folgt aus und t auch wunderbar:
Code:
Document docMain = new SAXBuilder().build("masks/test.xml");
			
Element eRootMain = docMain.getRootElement();
List<Element> lIncludeElements = eRootMain.getChildren("include");
for(int i = 0; i < lIncludeElements.size(); i++)
{
	Element e = lIncludeElements.get(i);
	int iIndexRoot = eRootMain.indexOf(e);
	String sIncludeFilename = e.getAttributeValue("value");
	Document dIncludeDocument = new SAXBuilder().build("masks/"+sIncludeFilename);
	Element eRoot = dIncludeDocument.getRootElement();
	eRoot.detach();
				
	eRootMain.addContent(iIndexRoot, eRoot);
	eRootMain.removeContent(e);
}

mfg Supa
 
Zurück