# JDOM - Problem beim Zusammenfügen zweier Dateien



## esmeralda (15. Okt 2009)

Hallo Allerseits,

nachdem ich mich nun den ganzen Abend dumm und dämlich gesucht hab und wieder an einem Fehler hänge bleibe, versuche ich mein Glück mal wieder hier. Bisher habt ihr mir hier immer super weitergeholfen - Danke!

Mein jetziges Problem hängt damit zusammen, dass ich aus einer bestehenden Datei einen bestimmten Teil (RULE samt aller Kinder) in einer anderen Datei einfügen möchte - beide haben die selbe Struktur.

Ich bekomme folgende Fehlermeldung beim Versuch:



> Exception in thread "main" org.jdom.IllegalAddException: The Content already has an existing parent "RULE"
> at org.jdom.ContentList.add(ContentList.java:209)
> at org.jdom.ContentList.add(ContentList.java:131)
> at org.jdom.ContentList.addAll(ContentList.java:283)
> ...



Hier der entsprechende Code:


```
if (new File("final_ruleset_np.xml").exists()) {
			
			//final_ruleset_np.xml einlesen und JDOM Objekt erstellen
			String[] rule_data = {"ruleset_np.xml"};
			compute_jdom last_rule = new compute_jdom(rule_data);
			//die letzte Regel wird aus dem Datensatz gelesen und danach in last_num gespeichert
			int last_num = new Integer(last_rule.find_last_num());
			System.out.println("letzte Regel-Nummer:"+last_num);
			//die Nummer der neuen Regel ist eins höher, also Inkrement
			rule_counter = last_num++;
	    	 
			
			//hänge das RULE aus der Datei ruleset_np an final_ruleset_np an
			
			//lies ruleset_np.xml ein und speichere alle Elemente, die angehangen werden sollen
			//lies ruleset_np.xml ein
			String data_add = "final_ruleset_np.xml";
			SAXBuilder builder_add = new SAXBuilder(); 
			
			try {
			     //Die XML-Datei wird eingelesen
			    Document doc_add = builder_add.build(data_add);
			   	Element root_add = doc_add.getRootElement();    

			   	//setze Attribute für RULE
				Element rule_set = root_add.getChild("RULE");
			   	rule_set.setAttribute("NUM", Integer.toString(rule_counter));
			   	rule_set.setAttribute("ACC", Double.toString(rule_acc));
			 	rule_set.setAttribute("FREQ", Integer.toString(rule_freq));
                                //kopiere den gesamten Inhalt, um ihn anzuhängen
			   	List rule_add = root_add.getChild("RULE").getContent();

			 	
				//lies final_ruleset_np.xml ein
				String data = "final_ruleset_np.xml";
				SAXBuilder builder = new SAXBuilder(); 
			
				//hänge die neuen Elemente plus die neuen Attribute an final_ruleset.xml an
			    Document doc = builder.build(data);
			   	Element root = doc.getRootElement();  
			   	//gehe zu letztem Element RULE und hänge dahinter an
				root.addContent(rule_add);
					
				// XML Datei schreiben - mit Umbrüchen
				XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); 
				BufferedWriter bw = new BufferedWriter(new FileWriter("final_ruleset_np.xml"));
				outp.output(doc, bw);
			}
			catch (IOException e){
				  System.err.println(e);
				} catch (JDOMException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
			
			System.out.println("Regel Nummer "+last_num+" wurde in den finalen Regelsatz übernommen.");
    	}
```

Teil der übernommen werden soll - nur RULE samt ganzem Inhalt (Kinder und Co.)
[XML]<?xml version="1.0" encoding="UTF-8"?>
<RULESET>
  <RULE S="NP">
    <word />
  </RULE>
</RULESET>[/XML]

Datei, an die angehangen werden soll.
[XML]<?xml version="1.0" encoding="UTF-8"?>
<RULESET>
  <RULE S="NP" NUM="1" ACC="1.0" FREQ="1">
    <word pos="Pgen" />
  </RULE>
</RULESET>[/XML]

Falls jemand eine Idee hat, was ich falsch gemacht habe, bzw. was ich anders angehen muss - ich bin für jeden Tipp mehr als dankbar .

*heißen Tee und Kekse hinstell*


----------



## esmeralda (16. Okt 2009)

Bin doch selber über die Lösung gestolpert. Wenn man folgende Zeile verwendet, wird auch kein Fehler mehr geschmissen und der Teil der einen Datei wird an die andere angehangen:


```
List rule_add = root_add.cloneContent();
```

Hatte auch noch ein paar kleine Variablen-Fehler drin...  Also weiter gehts ^_^


----------



## webmanie (16. Sep 2010)

Hallo zusammen, noch ein kleiner Nachtrag!

Die Exception jdom.IllegalAddException:The Content already has an existing parent ... 

wird geworfen wenn man versucht ein Element mit existierendem Parent in ein Element mit dem gleichen Parent zu adden. 

Deshalb gibt es hier die Element.clone() Methode. Diese ermöglicht es einen Klone zu erzeugen der sich so zusagen nicht mehr an seine Eltern erinnert. Damit ist es Problemlos möglich in über addContent einzufügen.

Ich hab dazu auch folgenden Artikel JDOM the Element addContent method - HowTo


----------

