Webservice XML parsen

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

  • Webservice XML parsen

    Hallo zusammen,

    ich bin in einem aktuellen Projekt dabei, den XML Result eines Webservices zu parsen.
    Dabei bin ich mit dem NSXMLParser auf ein Problem gestoßen.


    Hier der Auszug meines XMLReaders

    Quellcode

    1. - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    2. {
    3. NSLog(@"didStartElement");
    4. NSLog(elementname);
    5. }
    6. - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    7. {
    8. NSLog(@"didEndElement");
    9. NSLog(elementname);
    10. }
    11. - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    12. {
    13. currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    14. NSLog(@"parser");
    15. NSLog(currentNodeContent);
    16. }
    Alles anzeigen




    Das Problem ist nun, dass der Parser nur das Root Element erkennt und ausgibt, und dann aufhört zu lesen.
    In meinen Augen ist der XML String so auch nicht richtig, aber leider kann ich die Ausgabe des Webservices nicht ändern (Drittprodukt).


    Habt ihr eine Idee für das Problem?


    Regards,
    Matthias


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von kortos ()

    1. Du solltest nicht einfach einen String auf mutable String casten. Das geht in die Hose.
    2. NSLog solltest Du immer mit einem Format verwenden.
    3. Die Methode parser:foundCharacters: kann für die Zeichen innerhalb eines Tags mehrmals aufgerufen werden. Das passiert in der Regel bei Umlauten. Diese Methode muss also die Bestandteile des Strings aufsammeln.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich habe den Code jetzt mal folgendermaßen aufgebaut:

    Quellcode

    1. - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    2. {
    3. NSLog(@"startElement: %@", elementname);
    4. for(NSString *key in [attributeDict allKeys]) {
    5. NSLog(@" attrs: %@ = \"%@\"", key, [attributeDict valueForKey:key]);
    6. }
    7. }
    8. - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    9. {
    10. NSLog(@"endElement: %@", elementname);
    11. }
    12. - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    13. {
    14. NSLog(@" chars: %@", string);
    15. }
    Alles anzeigen



    Die Ausgabe bringt mir folgendes:

    Quellcode

    1. 2011-12-05 20:01:06.859 iPadTest[5511:707] startElement: root
    2. 2011-12-05 20:01:06.860 iPadTest[5511:707] chars:



    Wie komme ich nun an die einzelnen Rowe des XML Docs ran?
    Könnt ihr mir hier einen Tipp geben, wie ich da weiterkomme?

    Regards,
    Matthias
  • Hallo zusammen,

    ich habe jetzt mal den Auszug des XML Dokumentes als lokales XML Dokument in das Xcode Projekt eingefügt und lokal geladen.

    Siehe da, jetzt sieht die Ausgabe ganz anders aus:

    Quellcode

    1. 2011-12-05 21:13:26.076 iPadTest[1844:f803] startElement: root
    2. 2011-12-05 21:13:26.087 iPadTest[1844:f803] chars:
    3. 2011-12-05 21:13:26.162 iPadTest[1844:f803] startElement: row
    4. 2011-12-05 21:13:26.163 iPadTest[1844:f803] attrs: STRUKTUR_TEXT = "Zeile1"
    5. 2011-12-05 21:13:26.164 iPadTest[1844:f803] attrs: STRUKTUR_ID = "1163"
    6. 2011-12-05 21:13:26.165 iPadTest[1844:f803] endElement: row
    7. 2011-12-05 21:13:26.166 iPadTest[1844:f803] chars:
    8. 2011-12-05 21:13:26.166 iPadTest[1844:f803] startElement: row
    9. 2011-12-05 21:13:26.167 iPadTest[1844:f803] attrs: STRUKTUR_TEXT = "Zeile2"
    10. 2011-12-05 21:13:26.167 iPadTest[1844:f803] attrs: STRUKTUR_ID = "1196"
    11. 2011-12-05 21:13:26.168 iPadTest[1844:f803] endElement: row
    12. 2011-12-05 21:13:26.168 iPadTest[1844:f803] chars:
    13. 2011-12-05 21:13:26.169 iPadTest[1844:f803] startElement: row
    14. 2011-12-05 21:13:26.170 iPadTest[1844:f803] attrs: STRUKTUR_TEXT = "Zeile3"
    15. 2011-12-05 21:13:26.170 iPadTest[1844:f803] attrs: STRUKTUR_ID = "1154"
    16. 2011-12-05 21:13:26.171 iPadTest[1844:f803] endElement: row
    17. 2011-12-05 21:13:26.171 iPadTest[1844:f803] chars:
    18. 2011-12-05 21:13:26.173 iPadTest[1844:f803] endElement: root
    Alles anzeigen



    Jetzt die nächste Frage, warum läuft es mit einer lokalen Datei, und mit dem Webservice nicht?
    Die Ausgabe des Webservice sieht exakt gleich aus?

    Danke :)

    Regards,
    Matthias
  • Moin,

    so, diesen Code möchte ich euch nicht vorenthalten, ich denke hier muss irgendwo das Problem liegen:

    Quellcode

    1. -(id) loadXMLByURL:(NSString *)urlString
    2. {
    3. tweets = [[NSMutableArray alloc] init];
    4. NSURL *url = [NSURL URLWithString:urlString];
    5. NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    6. parser = [[NSXMLParser alloc] initWithData:data];
    7. parser.delegate = self; [parser parse];
    8. return self;
    9. }


    Die Methode bekommt als urlString folgenden Beispielwert übergeben:
    192.168.0.123/db/structure_val…r=0000&kost_nr=0000000000

    Wie oben beschrieben wird von dem XML, den der Webservice zurückgibt, nur der root Node zurückgegeben.

    Hat jemand noch ne Idee, woran das liegen könnte?

    Grüße,
    Matthias
  • Hallo zusammen,

    ich habe das Problem behoben, es lag an einem falschen Encoding des XML Strings.
    Ich habe das NSData Object auf das "NSUTF8StringEncoding" Encoding gesetzt, dann hat es funktioniert :)

    Ich habe das ganze aber nur über folgende Methode herausgefunden:

    Quellcode

    1. - (void)parseJourneyData:(NSData *)data parseError:(NSError **)err
    2. {
    3. }


    Die Methode gibt den ErrorCode 5 zurück, was für ein nicht wohl geformtes XML Statement spricht.



    Grüße,
    Matthias