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

  • Themenstarter Themenstarter Polo85
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
P

Polo85

Gast
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:

Code:
<article>
	<section>Eintrag a</section>
	<section>Eintrag c</section>
</article>


überarbeitete bzw.erwartete XML-Datei:

Code:
<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

Code:
doc.getRootElement().addContent(2,el);

-->

Code:
<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

Code:
doc.getRootElement().addContent(3,el);

-->
Code:
<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:

Code:
  doc.getRootElement().addContent(5,el);

-->
Code:
<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

Code:
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 :

Code:
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
 
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.
 
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:

Code:
<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.

Code:
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]
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben