# List vs. Iterator



## iwankoenig (4. Mrz 2009)

Hallo! Ich weiß der Titel ist blöd. Es ist mir einfach nichts besseres eingefallen. 
Bei dem Thema geht nicht um ein Problem, sondern eher um eine theoretische Frage. Und zwar:

Root-Element meiner XML-Datei heißt "documents". Dieses Element hat dann Unterelemente "document". Mein Ziel ist es die Infos von jedem "document" in eine Datenbank zu speichern.

Ich habe das bis jetzt  folgendermassen gemacht:
1. Mit Root-Element.getChildren("document") habe ich eine Liste von Elementen "document" mit allen Unterelementen von "document". Alles läuft wie geschmiert.
2. Dann muss ich für jedes Element die Infos bekommen (also auch von jedem Unterelement). Also, aus der List vom Schritt 1 bastele ich eien Iterator und los gehts:

```
Iterator<?> myIterator = documentList.iterator();
while(myIterator.hasNext){
     Element tmp = ((Element) myIterator.next()).getAttributValue("title");
     ......//Es gibt also mehrere Attribute und Unterelemente. Aber darum geht es nicht.
     Element tmp = ((Element) myIterator.next()).getChildText("source");
}
```

So. Und dieser Code liefert mir irgendwann "NoElementException". Also es sagt mir, dass "Child" mit dem Namen "source" nicht existiert. Obwohl das Element sehr wohl existiert.

3. Nun dann versuche ich exakt dasselbe zu machen nur nicht mit Iterator, sondern direkt mit der List vom Schritt 1:

```
for(int i=0; i < documentList.size(); i++){
     Element tmp = ((Element) documentList.get(i)).getAttributValue("title");
     ......//Es gibt also mehrere Attribute und Unterelemente. Aber darum geht es nicht.
     Element tmp = ((Element) documentList.get(i)).getChildText("source");
}
```

Die XML-Datei ist dieselbe. Also, es wurde nichts geändert. Nur ohne Iterator halt! Und dieser Code liefert mir keine Exception. Überhaupt keine Fehlermeldungen! Alles ist super. Ich bin zufrieden.

Frage ist jetzt: Was ist denn los? Wieso funktioniert es direkt mit List besser als mit dem Iterator, obwohl es mit dem Iterator besser sein sollte (das ist der Sinn der Einführung von Iteratoren).

Ich habe in keiner Literatur das Thema gefunden. Also, poste ich es hier.
Was meint ihr denn?


----------



## maki (4. Mrz 2009)

Dein Fehler.


```
while(myIterator.hasNext){
     Element tmp = ((Element) myIterator.next()).getAttributValue("title");
     ......//Es gibt also mehrere Attribute und Unterelemente. Aber darum geht es nicht.
     Element tmp = ((Element) myIterator.next()).getChildText("source");
}
```
Pro Durchlauf rufst du 2-mal next() auf, sollte eigentlich nur einmal sein.

Ps: Sieh dir doch mal die sog. For-each schleife an.


----------



## iwankoenig (4. Mrz 2009)

Verdammt. Daran habe ich überhaupt nicht gedacht! Danke! Das Thema ist geschlossen.


----------

