# [Newbie] [JDOM] Element aus XML entfernen klappt nicht



## jakob (14. Jun 2006)

Hi zusammen, 

ich habe dasselbe Prob wie in diesem Thread (http://www.java-forum.org/de/viewtopic.php?t=10897) geschildert. 

Meine XML Datei sieht so aus:


```
<kontakt name="test1">
    <anschrift>str</anschrift>
    <telefon1>123</telefon1>
    <telefon2 />
    <handy />
    <mail1>mail</mail1>
    <mail2 />
    <webseite>www</webseite>
    <kategorie />
  </kontakt>
```

Jetzt moechte ich das KOMPLETTE <kontakt name="test1"> und alle Unterelemente loeschen. Hier mein Code dafuer:


```
public void removeKontakt(String name) {
            Element adressverwaltung = getRoot(new File("adressverwaltung.xml"));
            Iterator kontaktNamen = adressverwaltung.getChildren( "kontakt" ).iterator();
            while ( kontaktNamen.hasNext() ) {
                Element kontakt = (Element) kontaktNamen.next();
                if ( kontakt.getAttribute( "name" ).getValue().equals(name) ) {
                    kontakt.removeContent();                    
                }
            }
            safeFile( new File( "adressverwaltung.xml" ) );
        }
```

Dannach sieht die XML Datei so aus:


```
<kontakt name="test1" />
```

Es soll aber alles weg. Leider schaffe ich das auch mit


```
kontakt.getParent().removeContent();
```

nicht. Hier bekomme ich immer


```
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
	at org.jdom.ContentList$FilterListIterator.checkConcurrentModification(ContentList.java:1041)
	at org.jdom.ContentList$FilterListIterator.hasNext(ContentList.java:752)
```

Freue mich ueber einen Tipp, 

Jakob


----------



## Timmah (14. Jun 2006)

So wie ich das sehe, entfernst du auch explizit mit


```
public void removeKontakt(String name) {
            Element adressverwaltung = getRoot(new File("adressverwaltung.xml"));
            Iterator kontaktNamen = adressverwaltung.getChildren( "kontakt" ).iterator();
            while ( kontaktNamen.hasNext() ) {
                Element kontakt = (Element) kontaktNamen.next();
                if ( kontakt.getAttribute( "name" ).getValue().equals(name) ) {
                    kontakt.removeContent();                   
                }
            }
            safeFile( new File( "adressverwaltung.xml" ) );
        }
```

nur die Child-Elemente vom Root-Element.

Also musst das Element adressverwaltung löschen. Dann ist alles darunter auch automatisch mit weg.


----------



## byte (15. Jun 2006)

Du darfst nicht aus einer Liste, über die Du iterierst, Elemente löschen. Daher die ConcurrentModificationException.


----------



## jakob (15. Jun 2006)

Hi zusammen, 

dank eurer beiden Tipps hat' geklappt:


```
public void removeKontakt(String name) {
            Element adressverwaltung = getRoot(new File("adressverwaltung.xml"));
            Iterator kontaktNamen = adressverwaltung.getChildren( "kontakt" ).iterator();

            Element zuLoeschendesElement = null;
            while ( kontaktNamen.hasNext() ) {
                Element kontakt = (Element) kontaktNamen.next();
                if ( kontakt.getAttribute( "name" ).getValue().equals(name) ) {
                    zuLoeschendesElement = kontakt;
                }
            }
            
            if (zuLoeschendesElement != null) {
                adressverwaltung.removeContent(zuLoeschendesElement);
            }
            safeFile( new File( "adressverwaltung.xml" ) );
        }
```

Bin wirklich begeistert von diesem tollen Forum!   

Liebe Gruesse,

Jakob


----------



## byte (15. Jun 2006)

Du könntest noch ein break; in der Schleife einbauen, wenn Du das zu löschende Element gefunden hast. Dann wird die Schleife nicht unnötigerweise weiter durchlaufen.


----------

