XML Parser funktioniert nicht richtig

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

  • XML Parser funktioniert nicht richtig

    Moin Leute,

    bin grad neu in diesem Forum und auch in der iPhone Entwicklung... Ich habe folgendes Problem :
    Wir machen immoment fuer ein Projekt in der Uni eine Wetterstation die durch ein Modul ausgelesen wird und die Daten ueber einen Windows Service in eine Datenbank schreibt. Das klappt auch alles wunderbar. Die Daten kommen jede Minute rein und aktualisieren sich. Zudem "Core System" muessen wir auch eine dynamische Website erstellen, dafuer haben wir XML Dateien geschrieben , die unsere Wetterdaten anzeigen lassen (z.B. GetLastTemperature, GetLastRain usw. )
    So ich habe nun ein iPhone App geschrieben, was einmal die Wetterdaten von unserer Station auslesen soll, einmal Other Locations anzeigen soll und einmal einen About Tab.... Die Tabs funktionieren auch alle....Der About Tab war ziemlich easy... Der Other Locations Tab n bisschen tricky , aber das habe ich auch hinbekommen.... Da liegt nun ein TableView drauf, indem verschiedene Staedte stehen die man anklicken kann und man gelangt in eine DetailView, mit den Wetterdaten der bestimmten Stadt.
    So nun fehlt mir nur noch eins... Und zwar das wichtigste , unsere Wetterdaten.
    Ich habe versucht diese mittels eines XML parsers rauszuholen. In meinem NSLOG werden die Daten auch angezeigt, nur bekomm ich sie nicht auf ein Label, weil die Daten nicht so ausgegeben werden, wie sie sollten. Mein NSXMLParser geht jede Zeile einzeln durch und zeigt mir die verschiedenen Elemente und Values von der XML Datei an. Wieso er eine so komische Zahl bei der Temperatur anzeigt weiss ich leider selber nicht...
    Ich hoffe ihr koennt mir weiterhelfen.

    Ich danke euch schon jetzt recht herzlich fuer die Hilfe....
    Falls ihr noch mehr wissen muesst etc. schreibt es bitte :)
  • Hey , danke fuer die Antworten

    ich hab jetzt nochmal durch mein Code geschaut und gefunden, wieso er so eine komische Zahl anzeigt.... Das habe ich jetzt behoben und er zeigt nur noch 0 an...

    Quellcode

    1. [self.currentTempLabel setText:[NSString stringWithFormat:@"%d °C"];

    Das ist der NSString stringWithFormat den ich gebrauche, ich weiss aber nicht genau was fuer einen Wert ich nach dem C einsetzen soll, damit er mir die Temperatur z.B. anzeigt.
    Ich moechte nur das von dem Processing Element : temperature , der Processing Value Wert von "22.44" auf meinem Label steht.
    Ich habe schon alles ausprobiert, aber ich bekomm es einfach nicht hin.

    Gruss Pascal
  • hast du die umbrüche auch rausgehollt? oder die strings (die temperaturen sind noch strings wenn sie ausn parser kommen) mal zu zahlen gecasted ?

    oder versuch mal
    // cTempFromXML is deine temperatur ausn parser

    Quellcode

    1. [self.currentTempLabel setText:[NSString stringWithFormat:@"%d °C", [cTempFromXML intValue]];
    俺の世界にようこそ

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

  • Wie kann ich die Umbrueche denn rausholen? Ich poste mal meine Parser .m Datei , dann koennt ihr das ein wenig mehr nachvollziehen was passiert

    Quellcode

    1. //
    2. // XMLParser.m
    3. // StendenWeather
    4. //
    5. // Created by user on 1/20/11.
    6. // Copyright 2011 __MyCompanyName__. All rights reserved.
    7. //
    8. #import "XMLParser.h"
    9. #import "Stenden_Weather.h"
    10. #import "StendenWeatherAppDelegate.h"
    11. @implementation XMLParser
    12. - (XMLParser *) initXMLParser
    13. {
    14. [super init];
    15. appDelegate = (StendenWeatherAppDelegate *)[[UIApplication sharedApplication] delegate];
    16. return self;
    17. }
    18. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    19. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    20. attributes:(NSDictionary *)attributeDict
    21. {
    22. if ([elementName isEqualToString:@"NewDataSet"]) {
    23. appDelegate.weather = [[NSMutableArray alloc] init];
    24. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"temperature > 0"];
    25. [appDelegate.weather filterUsingPredicate:predicate];
    26. }
    27. else if([elementName isEqualToString:@"Table1"]){
    28. currentWeather = [[Stenden_Weather alloc] init];
    29. //currentWeather.weatherID = [[attributeDict objectForKey:@"weatherID"] integerValue];
    30. //NSLog(@"Reading id value : %i", currentWeather.weatherID);
    31. }
    32. NSLog(@"Processing Element : %@", elementName);
    33. }
    34. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    35. {
    36. if (!currentElementValue)
    37. currentElementValue = [[NSMutableString alloc] initWithString:string];
    38. else
    39. [currentElementValue appendString:string];
    40. NSLog(@"Processing Value : %@", currentElementValue);
    41. }
    42. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    43. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    44. {
    45. if ([elementName isEqualToString:@"DataSet"])
    46. return;
    47. if ([elementName isEqualToString:@"Table1"]) {
    48. [appDelegate.weather addObject:currentWeather];
    49. [currentWeather release];
    50. currentWeather = nil;
    51. }
    52. else
    53. [currentWeather setValue:currentElementValue forKey:elementName];
    54. //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"temperature > 0"];
    55. [currentElementValue release];
    56. currentElementValue = nil;
    57. }
    58. - (void)dealloc {
    59. [super dealloc];
    60. [currentElementValue release];
    61. [currentWeather release];
    62. }
    63. @end
    Alles anzeigen



    Hier holt er die Daten aus der XML raus und laesst die in dem NSLog anzeigen. Das funktioniert ja auch alles. Nur das Label regt mich grad n bisschen auf.
  • :S
    ich bekomm das nich richtig hin...Das regt mich auf... Ich hab deine Klasse mit eingebunden und versucht den String mit dem Befehl trim kleiner zu machen ... klappt aber nicht...
    Wie koennte ich denn die NSLog Processing Values in einen String bekommen ?

    Quellcode

    1. 2011-01-21 11:12:25.752 StendenWeather[1525:207] Processing Element : Table1
    2. 2011-01-21 11:12:25.753 StendenWeather[1525:207] Processing Value :
    3. 2011-01-21 11:12:25.754 StendenWeather[1525:207] Processing Element : weatherID
    4. 2011-01-21 11:12:25.755 StendenWeather[1525:207] Processing Value :
    5. 6240
    6. 2011-01-21 11:12:25.756 StendenWeather[1525:207] Processing Value :
    7. 2011-01-21 11:12:25.757 StendenWeather[1525:207] Processing Element : temperature
    8. 2011-01-21 11:12:25.757 StendenWeather[1525:207] Processing Value :
    9. 20.94
    10. 2011-01-21 11:12:25.759 StendenWeather[1525:207] Processing Value :
    11. 2011-01-21 11:12:25.759 StendenWeather[1525:207] Processing Element : windDirection
    12. 2011-01-21 11:12:25.760 StendenWeather[1525:207] Processing Value :
    13. NW
    14. 2011-01-21 11:12:25.762 StendenWeather[1525:207] Processing Value :
    15. 2011-01-21 11:12:25.763 StendenWeather[1525:207] Processing Element : windSpeed
    16. 2011-01-21 11:12:25.764 StendenWeather[1525:207] Processing Value :
    17. 0
    18. 2011-01-21 11:12:25.764 StendenWeather[1525:207] Processing Value :
    19. 2011-01-21 11:12:25.765 StendenWeather[1525:207] Processing Element : rainVolume
    20. 2011-01-21 11:12:25.766 StendenWeather[1525:207] Processing Value :
    21. 0
    22. 2011-01-21 11:12:25.767 StendenWeather[1525:207] Processing Value :
    23. 2011-01-21 11:12:25.768 StendenWeather[1525:207] Processing Element : measurementDateTime
    24. 2011-01-21 11:12:25.769 StendenWeather[1525:207] Processing Value :
    25. 2011-01-21T10:53:06+01:00
    26. 2011-01-21 11:12:25.770 StendenWeather[1525:207] Processing Value :
    27. 2011-01-21 11:12:25.771 StendenWeather[1525:207] Processing Value :
    28. 2011-01-21 11:12:25.772 StendenWeather[1525:207] Processing Value :
    29. 2011-01-21 11:12:25.772 StendenWeather[1525:207] Processing Value :
    30. 2011-01-21 11:12:25.773 StendenWeather[1525:207] No Errors
    Alles anzeigen


    Bei der Other Locations Tab habe ich die xml abfrage ueber TouchXML gemacht mit dem CXMLDocument... Das hat auch alles geklappt, das habe ich natuerlich auch schon bei unserer XML probiert, aber das klappt auch nicht so wirklich... Wir haben auch n schlechten Aufbau von der XML Datei wie ich finde.

    Quellcode

    1. <DataSet>
    2. <xs:schema id="NewDataSet">
    3. <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    4. <xs:complexType>
    5. <xs:choice minOccurs="0" maxOccurs="unbounded">
    6. <xs:element name="Table1">
    7. <xs:complexType>
    8. <xs:sequence>
    9. <xs:element name="weatherID" type="xs:int" minOccurs="0"/>
    10. <xs:element name="temperature" type="xs:double" minOccurs="0"/>
    11. <xs:element name="windDirection" type="xs:string" minOccurs="0"/>
    12. <xs:element name="windSpeed" type="xs:double" minOccurs="0"/>
    13. <xs:element name="rainVolume" type="xs:double" minOccurs="0"/>
    14. <xs:element name="measurementDateTime" type="xs:dateTime" minOccurs="0"/>
    15. </xs:sequence>
    16. </xs:complexType>
    17. </xs:element>
    18. </xs:choice>
    19. </xs:complexType>
    20. </xs:element>
    21. </xs:schema>
    22. <diffgr:diffgram>
    23. <NewDataSet>
    24. <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
    25. <weatherID>6227</weatherID>
    26. <temperature>21</temperature>
    27. <windDirection>NW</windDirection>
    28. <windSpeed>0</windSpeed>
    29. <rainVolume>0</rainVolume>
    30. <measurementDateTime>2011-01-21T10:41:47+01:00</measurementDateTime>
    31. </Table1>
    32. </NewDataSet>
    33. </diffgr:diffgram>
    34. </DataSet>
    Alles anzeigen
  • Ok danke ;)
    Wenn das geklappt hat, kannst du mir dann vielleicht noch erklaeren wie ich die NSXMLParser von dir richtig einbinden kann?
    Das ist ganz gut das du sowas geschrieben hast ;) und vor allem fuer alle zugaenglich machst...
    Wie lange bist du schon in der iPhone App Programmierung?
  • aktiv seit juni letzen jahres.
    den praser da hab ich september geschrieben. (saß auch gute 4-6 stunden dran, gefühlt eine woche :D)

    im anhang ein test projekt mit deiner xml.
    EDIT: hab vergessen das label noch im interface builder zu verbinden :) muste machen dann siehst du was!

    PS: im xml parser von mir wird sobald mehere elemente vorkommen
    <pro>
    <muh></muh>
    <muh></muh>
    <muh></muh>
    </pro>
    jedes dict in ein array gespeichert und wegen zugänglich machen ich teile gerne code der mir treue dienste leistet ... dafür nhem ich auch code aus den netz :)
    das ist ein geben und nehmen!
    俺の世界にようこそ

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Plany ()

  • Hey, das hat bei mir auch geklappt.... Das mit dem Label hatte ich schon gesehen gehabt , aber danke dass du nochmal drauf hingewiesen hast ;)
    Mit der test XML Datei klappt das alles , aber ich will auf einen Link im Internet zugreifen, da klappt das noch nicht so richtig...
    Ich hab einen neuen NSString erstellt mit der URL drin und versucht das Programm dann so zu starten aber dann zeigt er mir nichts an

    Quellcode

    1. NSString *url = [NSString stringWithFormat:@"http://server-ict.nl:82/weatherstation/service1.asmx/GetLastWeatherResults/"];
    2. NSString *path = [[NSBundle mainBundle] pathForResource:url ofType:@"xml"];


    Mit der URL komm ich direkt auf die XML Seite, ich habe auch schon versucht , diese direkt einzugeben bei dem path. Funktionierte auch nicht.

    Gruss
  • nsbundle erlaubt dir zugriff auf dein Bundle (daten in deiner app)

    Quellcode

    1. NSData *webData = [NSData dataWithContentOfFile:@"http://example.com"];
    2. // und die webData einfach in den parser laden!


    obwohl ich immer versuche daten immer async zu laden mit NSURLConnection :) einfach mal die doku ansehen ;)
    URL Loading System Programming Guide
    俺の世界にようこそ

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Plany ()

  • Super , bis jetzt hat alles sehr gut geklappt :D
    Ich hab zum testen nochmal die test.xml genommen und die Daten werden jetzt auch in Labels angezeigt. Aber ich hab noch ein paar Fragen :S

    Erst einmal gibt er mir bei der NSData einen Fehler : Incompatible Objective C types struct NSData expected struct NSString when passing argument 1 of pathForResource:ofType: from distinct Objective C type

    Quellcode

    1. NSData *webData = [NSData dataWithContentsOfFile:@"http://server-ict.nl:82/weatherstation/service1.asmx/GetLastWeatherResults"];
    2. NSString *path = [[NSBundle mainBundle] pathForResource:webData ofType:@"xml"];
    3. NSData *xmlData = [NSData dataWithContentsOfFile:path];


    So fuege ich ihn doch richtig ein oder nicht?

    Und das zweite ist, das die Labels sich jetzt irgendwie nicht aktualisieren... Ich braeuchte immer die aktuellen Wetterdaten von der XML Datei, ich habe die test.xml schon geloescht und diese steht auch nicht mehr im Code und trotzdem laesst er noch die Daten von der test.xml sehen.

    Und auf ein letztes ^^
    Windrichtung ist ein String, wie uebergebe ich den denn richtig?

    Quellcode

    1. currentWindDirecLabel.text = [NSString stringWithFormat:@"%d", windDirecStr];


    Damit funktioniert das nicht so wirklich oder er zickt noch wegen dem Problem oben rum (dass er sich nicht aktualisiert)

    Gruss und danke nochmal fuer die Hilfe, hat mich bisher richtig weiter gebracht :)



    Edit :::::::

    Ok hab jetzt die test.xml wieder reingeladen und die Daten veraendert, dann uebernimmt er die Aenderungen, komisch.....
    Das ist aber nich Sinn der Sache, ich werde noch ein bisschen weiter probieren....
    Bei der Regenmenge gibt er mir auch keine Kommazahlen mit, auch wenn ich den Wert auf Double aender, dann kommen sehr komische Werte , wie -1432949 oder so... Vielleicht muesste ich den auch in einem String uebergeben...

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

  • wegen dein internet problem

    less dir den post von mir durch :) osxentwicklerforum.de/index.ph…&postID=136604#post136604
    du willst den inhalt einer datei aus den internet laden .. ggf auch danach googlen

    kleiner tipp so kann man vorgehen beim suchen:
    NSXMLParser <- NSData <- NSURL

    wegen dein 2ten problem
    guck dir die seite mal an!
    developer.apple.com/library/ma…ef/doc/uid/TP40004265-SW1

    bei ein double (float) wert bentzt man %f
    俺の世界にようこそ

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Plany ()