# Probleme mit JDom . addContent(int index,Collection c)



## Polo85 (19. Mrz 2007)

Guten Tag,

ich sitze schon eine längere Weile an einem Problem und hoffe durch euch Hilfe zu bekommen.

Also folgendes Problem liegt vor:

Ich habe ein XML Dokument, dem eine unbestimmte Anzahl an Knoten hinzugefügt werden soll.

Bevor ich die Knoten jedoch hinzufüge muß, muß ich noch die richtige Position herausfinden an der der Knoten hinzugefägt werden soll.

Ich versuche nun das nötigste zum Verständnis meines (Verständis-)Problems darzustellen

zur Visualisierung:

ursprüngliche XML-Datei:


```
<article>
	<section>Eintrag a</section>
	<section>Eintrag c</section>
</article>
```
 

überarbeitete bzw.erwartete XML-Datei:


```
<article>
	<section>Eintrag a</section>
        <section>Eintrag b</section>
        <section>Eintrag bb</section>
        <section>Eintrag c</section>
	<section>Eintrag d</section>
</article>
```


Ich finde heraus das "Eintrag b" zwischen Eintrag a und Eintrag c gehört, also an die 2 <article> Stelle

Also rufe ich die Methode


```
doc.getRootElement().addContent(2,el);
```

-->


```
<article>
	<section>Eintrag a</section>
        <section>Eintrag b</section>
        <section>Eintrag c</section>
</article>
```

auf. Wie erwartet erhalte ich auch das erwünschte Ergebnis und ich komme auf die Idee noch den Eintrag bb hinter Eintrag b einzufügen.
Also rufe ich erneut die Methode


```
doc.getRootElement().addContent(3,el);
```

--> 

```
<article>
	<section>Eintrag a</section>
        <section>Eintrag b</section>
        <section>Eintrag bb</section>
        <section>Eintrag c</section>
</article>
```

auf und es klappt erneut.

So zu letzt versuche ich den Eintrag d an die 5 Stelle hinzufügen:


```
doc.getRootElement().addContent(5,el);
```

-->

```
<article>
      <section>Eintrag a</section>
      <section>Eintrag b</section>
      <section>Eintrag bb</section>
      <section>Eintrag d</section>
      <section>Eintrag c</section>
</article>
```

Nun stellt sich mit die Frage warum ich 


```
doc.getRootElement().addContent(6,el)
```

aufrufen muß um mein erwünschtes Ergebnis zu erhalten.

Ich hoffe ich habe mein Prob nicht all zu umständlich erklärt, jedoch bin ich dabei einen Automatismus einzubauen der über eine Iteration dynamisch die richtige Stelle im Xml Dokument erkennt und den Eintrag an die richtige Stelle schreibt, wobei mir noch der richtige Algorithmus fehlt.

in etwa so :


```
for (int i = 0; i < anzahlEinträge; i++)
{
   if(neuerEintragGehoertAnDieseStelle)
   {
      intOrt = i + (???) ));  
      break;
   }
}
```
 
doc.getRootElement().addContent(intOrt,el);



Viele Grüße
und Danke im Voraus für eure Bereitschaft zu Helfen

Polo85


----------



## Gast (21. Mrz 2007)

Ich denke mal, dass das der neue Eintrag vor den Eintrag, der aktuell an der genannten Position ist, gesetzt wird. Dabei wird, wenn du einen Index nennst, der nicht vorhanden ist, der höchste vorhandene angenommen. Zumindest schließe ich das aus deinen Beispielen.


----------



## polo85 (22. Mrz 2007)

Hallo!

Also ich habe nun einen guten Lösungsansatz für mein Problem gefunden.
Ihr könnt mich gerne noch Tipps geben, aber ich denke dieser Ansatz ist Ok.

Ich gehe nun davon aus das bereits das XML-Dok wie folgt aussieht:


```
<article>
      <section>Eintrag a</section>
      <section>Eintrag b</section>
      <section>Eintrag bb</section>
      <section>Eintrag c</section>
</article>
```

Als erstes hole ich mir alle children vom root.
Iteriere solange über die children bis meine Bedingung erfüllt ist, hole mir mit der magischen Methode, die ich bisher nicht kannte, *indexOf()* den Inhalt des Childs das vor meinem neuen Eintrag kommt und addiere den mit eins damit sich der neue Eintrag hinten anfügt.


```
Iterator<Element> children = doc.getRootElement().getChildren().iterator();
Element elm = null;
int idx = 0;
		
while (children.hasNext())
{
   elm = children.next();
   idx = 0;
   if (elm != null)
   {
       if (elm.getText().equals("Eintrag c"))
       {
	      idx = doc.getRootElement().indexOf(elm);
	      doc.getRootElement().addContent(idx + 1, new Element("section").addContent("Eintrag d"));
	      break;
        }
    }
}
```

Solltet ihr noch bessere Lösungsmöglichkeiten haben, so postet bitte herein.

Viele Grüße Polo85[/quote]


----------

