# JDOM und entfernen von children



## lordcarlos (3. Nov 2009)

Hallo

Ich habe eine XML datei die folgendermaßen aufgebaut ist:

[XML]
<root>
  <data trigger="hund">
der hund heist Julian
  </data>
  <data trigger="katze">
Die katze hat bestimmt wieder gekifft!
  </data>
  <data trigger="hund">
er kann gut auto fahren
  </data>
</root>
[/XML]
*FRAGE 1:*
Jetzt moechte ich z.B. den zweiten eintrag mit dem trigger "hund" entfernen"


```
public void removeData(String str, int c)
      throws JDOMException, IOException {
    int a = 0;
    SAXBuilder b = new SAXBuilder();
    try{
      Document doc = b.build("src/test_1/data.xml");
      Iterator<Element> i = doc.getRootElement().getChildren().iterator();
      while (i.hasNext()) {
        Element e = i.next();
        String name = e.getAttributeValue("trigger");
        if (name.equals(str)) {
          if(a==c) {
            e.removeContent();
            e.removeAttribute(str);
            XMLOutputter outputter = new XMLOutputter();
            outputter.output(doc, System.out);
          }
          a++;
        }
      }
    } catch (IOException e) {
      System.out.println(e);
    }
  }
```

Ich rufe also removeData("hund", 2); auf.
Aber was muss in der inneren if schleife stehen damit der ganze <data> block geloescht wird?
            e.removeContent();
            e.removeAttribute(str);
Die beiden Sachen reichen nicht, dann steht da noch so etwas wie: <data trigger="hund"></data>

*FRAGE 2:*
Ich habe auch eine Funktion die einen neuen Eintrag hinzu fuegt:

```
public void addData(String trigger, String str) throws JDOMException, IOException {
    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build("src/test_1/data.xml");
    Element root = doc.getRootElement();

    Element newItem = new Element("data");
    newItem.setAttribute("trigger", trigger);
    newItem.setText(str);

    root.addContent(newItem);
    
    XMLOutputter outputter = new XMLOutputter();
    outputter.output(doc, new FileOutputStream("src/test_1/data.xml"));

  }
```

Das sieht dann aber haeslich aus weil er keine Zeilen umbrueche macht:
[XML]
<root>
  <data trigger="hund">
der hund heist Julian
  </data>
  <data trigger="katze">Die katze hat bestimmt wieder gekifft!</data><data>trigger="hund">er kann gut auto fahren</data></root>
[/XML]
Gibt es eine Funktion die, die Zeilenumbruehe hinzu fuegt?

Vielen dank!
lord-carlos


----------



## bummerland (3. Nov 2009)

Schau dir mal Element (JDOM v1.1.1) und Format (JDOM v1.1.1) an.


----------



## lordcarlos (3. Nov 2009)

Danke das mit format geht schonmal.

Aber das loeschen immer noch nicht.
Ich bin mir nicht sicher wo ich removeChild aufrufen soll.
Wenn ich e.removeContent(); und removeAttribute(str); durch removeChild("data") ersetze, wird das XML document nicht verändert.


----------



## bummerland (3. Nov 2009)

Du musst das auf dem root Element machen, da das data Element ja ein Child vom root ist.


----------



## lordcarlos (3. Nov 2009)

ah, einfach i.remove();
Jetzt geht das.
Danke:


----------

