JDOM - neue Elemente in bestehendes Dokument einfügen

lubu

Mitglied
Hi,

ich schlage mich gerade mit dem Problem herum, in einem eingelesenen XML-Dokument mittels JDOM, bei bestimmten Elementen neue Elemente einzufügen.

Der Baum wird mittels einer Iteration durchlaufen und ich laufe immer auf eine Exception (ConcurrentModificationException), wenn ich in den Baum ein neues Element einfüge. Warum das Problem entsteht, ist mir klar, da ich die Liste durch das Einfügen verändere auf dem die Iteration basiert. Ich bekomme es nur nicht anders hin.

Hier mein Kurzbeispiel:

Filter filter = new ElementFilter("wert");

Iterator it = doc.getDescendants(filter);

while (it.hasNext()){

Content content = (Content) it.next();

Element element = new Element("test");

// das neue Element "test" wird unterhalb des Parents erzeugt, da es auf gleicher
// "Ebene", wie das gesuchte Element "wert" platziert werden soll.
Element elementParent = content.getParentElement();

elementParent.addContent(content);
}

Nach dem ersten Durchlauf und dem erfolgreichen Einfügen des neuen Elements wird die
ConcurrentModificationException geschmissen. In meinem ursprünglichen Code habe ich eine Schleife außen herum gelegt und die Exception abgefangen, sodass es funktioniert, aber ist das die richtige Lösung?
Gibt es da nicht was Besseres, da das ganze recht aufwändig ist und mir auch fehleranfällig erscheint?

Tschau
 
Hallo,

lubu hat gesagt.:
while (it.hasNext()){
Content content = (Content) it.next();
Element element = new Element("test");

// das neue Element "test" wird unterhalb des Parents erzeugt, da es auf gleicher
// "Ebene", wie das gesuchte Element "wert" platziert werden soll.
Element elementParent = content.getParentElement();
elementParent.addContent(content);
}
Das neue Element test wird zwar erzeugt, das war es dann aber auch schon. Du holst dir den Elternknoten von content und erzeugst content nochmal - du verdoppelts also Content.

Also wenn du ein test-element auf gleicher Ebene zu jedem! wert-Element erzeugen willst
wäre das eine Möglichkeit:
Code:
Filter filter = new ElementFilter("wert");
Iterator it = doc.getDescendants(filter);

//die Liste wo die Parentelemente reinkommen
List addChild = new ArrayList;

while (it.hasNext()){
  Content content = (Content) it.next();
  Element elementParent = content.getParentElement();
  addChild.add(elementParent);
}

Iterator addIt=addChild.iterator();
while(addIt.hasNext())
{
 ((Element)addIt.next()).addContent(new Element("test"));
}
Ohne Garantie auf Eleganz, Schnelligkeit etc. etc.

hth
THMD
 
Zurück