# JDOM Element löschen



## ratze79 (25. Juli 2007)

Hallo!

Ich habe eine XML-Datei in der ich bestimmte Elemente löschen möchte. Hier erstmal die XML:

```
<userData>
  <user id="7">
    <name>d</name>
    <pass>NWoZK3kTsExUV00Ywo1G5jlUKKs=</pass>
  </user>
  <user id="8">
    <name>q</name>
    <pass>NWoZK3kTsExUV00Ywo1G5jlUKKs=</pass>
  </user>
  <user id="9">
    <name>w</name>
    <pass>NWoZK3kTsExUV00Ywo1G5jlUKKs=</pass>
  </user>
</userData>
```

Ich möchte jetzt z. B. den User mit der id 8 komplett mit allen Unterelementen löschen. Ich schaffe es alle Unterelemente zu löschen mit:


```
if(id_counter == tmpUser.getID())
		{
		  entityElement.removeChild("name");
		  entityElement.removeChild("pass");
		}
```

Leider bleibt dann das Elemente User als leeres Element übrig.

Eine andere Möglichkeit die ich ausprobiert habe ist direkt vom Root aus das Element zu löschen, mit dem Problem das ich nur den ersten User löschen kann und nicht den, den ich gerne hätte:


```
if(id_counter == tmpUser.getID())
		{
		  UserData.removeChild("user");
		}
```

Es schein so als ob der Iterator nicht auf dem richtigen Element steht.
Kann man den Iterator auf ein bestimmtes Element setzten? Oder gibt es eine andere Möglichkeit.

Danke im Voraus.

Gruß Ratze


----------



## torax13 (25. Juli 2007)

Ich nehme an Du verwendest JDOM?
Eine Möglich das zu machen wäre dann (aus dem Kopf)

```
Element userData; // zeigt bereits auf den <userdata> Knoten
List<Element> users = userData.getChildren("user");
for(Element user : users) {
  if(user.getAttribute("id").equalsignoreCase("8")) {
    userData.removeContent(user);
  }
}
```


----------



## ratze79 (25. Juli 2007)

Mit deiner Lösung komme ich leider noch nicht weiter. Ich habe aber in einem Buch einen Ansatz gefunden und ihn mal umgesetzt:


```
Document doc = new Document();
Element root = new Element("userData");
doc.setRootElement(root);
Iterator it;
Element UserData;
SAXBuilder sxbuild = new SAXBuilder();
InputSource is = new InputSource(filename);
							
	try 
	{
		
		doc = sxbuild.build(is);
		Content test = doc.getRootElement().removeContent(1);
		List li = doc.getRootElement().getContent();
		it = li.iterator();

        } 
	catch (IOException e) 
        {
		e.printStackTrace();
		return;
	}   
	catch (JDOMException e) 
	{
		e.printStackTrace();
		return;
	}
```

Damit löscht er das erste Child-Element nach dem Root, z. B. User 7.

Man soll laut Buch über "Content test = doc.getRootElement().removeContent(1);" das zu löschende Element auswählen können. In dem Buchbsp. ist es removeContent(0); um das erste zu löschen, da passiert leider nichts. Bei (1) löscht er bei mir wirklich das erste Element, wenn ich allerdings (2) (3) usw. auswähle passiert nichts.


----------



## torax13 (25. Juli 2007)

Wo hängst Du mit meinem Ansatz? Was klappt da nicht? Wie gesagt, ich hab das so aus dem Kopf hingepinselt, könnt sein, das es da noch was Fehlt (hoffe aber nicht).

Element.removeContent(1) ist hier [1] in der API. Leider hab ich auf nen schnellen Blick nicht entdeckt, ob index bei 0 oder bei 1 anfängt, würde aber ganz stark auf 0 tippen.

[1] http://jdom.org/docs/apidocs/org/jdom/Element.html#removeContent(int)

Gruß


----------

