NSScanner, While-Schleife scannt nicht bis zum Ende

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSScanner, While-Schleife scannt nicht bis zum Ende

    Hallo,

    spiele gerade mit Swift im Playground und hänge etwas fest. Vorlage ist dieses Beispiel:
    developer.apple.com/library/ma…gs/Articles/Scanners.html
    (ganz unten das "Example")

    Hier mein Code in Swift:

    Quellcode

    1. var scannerBaustellen:NSScanner = NSScanner(string: tempBaustellen)
    2. while scannerBaustellen.atEnd == false {
    3. scannerBaustellen.scanUpToString("<li class='beschreibung'>", intoString: nil)
    4. scannerBaustellen.scanString("<li class='beschreibung'>", intoString: nil)
    5. scannerBaustellen.scanUpToString("</li>", intoString: &meldungBaustellen)
    6. println("\(meldungBaustellen)")
    7. }


    Hier ein Auszug des HTML-Codes/Strings (tempBaustellen):

    Quellcode

    1. <h4>Baustellen</h4><ul><li class='beschreibung'>Baustelle 1</li><li class='beschreibung'>Baustelle 2</li></ul><br />


    Der letzte Treffer wird doppelt angezeigt. Wie kann das verhindert werden? Natürlich könnte ich das mit einer If-Abfrage unterbinden. Normal kommt es mir nicht vor.

    Gibt es eine bessere bzw. elegantere Möglichkeit in Swift? Im HTML-Text parse ich weitere "h4-Abschnitte".

    Danke, Gruß

    Helmut

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von helmut72 ()

  • Doch, das Verhalten ist absolut richtig. Nach dem letzten li kommt ja sicherlich noch das Ende der HTML-Datei, also ist der Scanner noch nicht am Ende und geht deshalb in eine weitere Runde. Dort finden die Scanner-Methoden zwar nichts mehr, aber du ignorierst ja die Rückgabewerte der Methoden, sodass du diese Runde nochmal als validen Eintrag interpretierst. Du solltest die Rückgabewerte der Methoden auswerten und ggf. die Schleife abbrechen bzw. die Meldung nur ausgeben, wenn tatsächlich etwas gelesen wurde.
    Multigrad - 360°-Produktfotografie für den Mac
  • Danke für den Hinweis! :) Eigentlich logisch, aber hatte ne Denkblokade. Nun wird vorm Suchen meldungBaustellen auf "" gesetzt. Das letzte Suchergebnis ist ja dann immer leer und wird nach der Schleife einfach gelöscht. Weiß nicht, ob eine Abfrage in der Schleife noch einen Sinn macht, wenn es sowieso der letzte Durchgang in der while-Schleife ist.
    Ohne Meldungen ("keine Baustellen") enthält der HTML-Teil nur <ul> und bei Meldungen gibt es mindestens ein <ul><li..., deshalb noch die If-Abfrage. Sieht dann komplett so aus, um das Thema zu abzuschließen:

    Quellcode

    1. if tempBaustellen?.hasPrefix("<ul><li") == true {
    2. var scannerBaustellen:NSScanner = NSScanner(string: tempBaustellen)
    3. while scannerBaustellen.atEnd == false {
    4. meldungBaustellen = NSString(string: "")
    5. scannerBaustellen.scanUpToString("<li class='beschreibung'>", intoString: nil)
    6. scannerBaustellen.scanString("<li class='beschreibung'>", intoString: nil)
    7. scannerBaustellen.scanUpToString("</li>", intoString: &meldungBaustellen)
    8. listeBaustellen += meldungBaustellen!
    9. }
    10. listeBaustellen.removeLast()
    11. } else {
    12. listeBaustellen += "Keine Baustellen!"
    13. }
    Alles anzeigen


    Nochmal Danke! :)