# [Frage] iterator bei jdom bricht ab



## sxe (15. Jul 2004)

Hallo zusammen.

Gerade angemeldet und schon ne Frage ... aber was sollte ich auch sonst hier? :]

nun gut .. also zu meiner Frage


folgender Code funktioniert :


```
List children = current.getChildren();    
Iterator iterator = children.iterator();  
   
while (iterator.hasNext()) {       
  Element child = (Element) iterator.next();      
   System.out.println(child.getName());     
}
```

Bei dem Code werden per jdom alle Unterelemente ausgegeben.

Den obigen Code habe ich dann erweitert zu folgendem:


```
List children = root.getChildren();
	  Iterator iterator = children.iterator();
	  
	  while (iterator.hasNext()) {
	  	
		Element child = (Element) iterator.next();
		System.out.println(child.getName());
	  	if (!child.getName().equals(current)) {
			Element a = new Element(child.getName()).setText(child.getText());	
			root.addContent(a);		
	  	} else {		
			Element a = new Element(child.getName()).setText(value);
			System.out.println(a.getText());
			root.addContent(a);
			System.out.println(a.getName() + " wurde in " + a.getText() + " geaendert.");
	  	}
	  	
	  }
```

Mit dem Code will ich ein bestimmtes child Element verändern (den text) und die anderen unverändert in die xml Datei zurück schreiben. Er bricht aber immer nach dem ersten durchlauf der if schleife mit folgendem Fehler ab:


```
Exception in thread "main" java.util.ConcurrentModificationException
        at org.jdom.ContentList$FilterListIterator.checkConcurrentModification(ContentList.java:978)
        at org.jdom.ContentList$FilterListIterator.hasNext(ContentList.java:689)
        at Xml_put.change(Xml_put.java:54)
        at ajcc.main(ajcc.java:42)

[/Ccode] 

Zur Info : Zeile 54 ist folgende Zeile: while (iterator.hasNext()) {

Danke schonmal 

bye
```


----------



## Grizzly (16. Jul 2004)

So wie ich das verstanden habe, gehst Du mit dem Iterator die Unterelemente des Root-Elements des XML Dokumentes durch. Und dazwischen fügst Du in dieses Root-Element weitere Elemente hinzu.
Dann ist das Problem klar: Ein Iterator arbeitet eine Ansammlung an Daten ab. Und dieser Datenmenge fügst Du Elemente hinzu. Das funktioniert nicht. In diesem Fall müsstest Du die Liste direkt mit einer for-Schleife durchgehen.

Abgesehen davon scheint es mir, dass die Schleife - sofern dieser Fehler nicht auftreten würde - sowieso endlos laufen würde: Du testest auf einen bestimmten Namen und hängst dann ein Element mit dem gleichen Namen, wie das aktuelle Element hat, an das Root-Element sprich die Liste hin. Aber irgendwann müsste der Iterator auch an diesen neuen Elementen vorbeikommen und daraufhin weitere Elemente anhängen, usw., usw., usw.  .


----------



## Guest (16. Jul 2004)

Hi Grizzly

Danke für deine Hilfe .. der Tip das ich den inhalt des Iterators nicht ändern darf war Gold wert.

Ich habe es etzt so gemacht.


```
public void change(String current, String value) {
	  
	  Element root1 = new Element(root.getName());
	  Document clone = new Document(root1);	
	  
	  List children = root.getChildren();
	  Iterator iterator = children.iterator();
	  
	  while (iterator.hasNext()) {
	  	
		Element child = (Element) iterator.next();
		
	  	if (!child.getName().equals(current)) {
			Element a = new Element(child.getName()).setText(child.getText());	
			root1.addContent(a);		
	  	} else {		
			Element a = new Element(child.getName()).setText(value);
			System.out.println(a.getText());
			root1.addContent(a);
			System.out.println(a.getName() + " wurde in " + a.getText() + " geaendert.");
	  	}
	  	
	  }
          }
```

So kann ich später einfach das neu erstellte Document clone in die Datei schreiben.

Danke nochmal

bye

sxe


----------



## sxe (16. Jul 2004)

ok warum ich jetzt schon wieder als Gast geantwortet habe versuche ich erst garnicht zu erklären :]


----------



## Beni (16. Jul 2004)

sxe hat gesagt.:
			
		

> ok warum ich jetzt schon wieder als Gast geantwortet habe versuche ich erst garnicht zu erklären :]



Es gibt sonst beim Einwahlfenster ein Kästchen "automatisch einloggen"...  :wink:  :bae:


----------

