Wie parse ich ein einfaches .xml-file in mehrere Textfelder?

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

  • Wie parse ich ein einfaches .xml-file in mehrere Textfelder?

    Guten Tag,
    ich bin neu hier im Forum, zumindest was das erstellen von Beiträgen angeht. Nun zu meinem Problem, folgender Codeschnipsel zeigt mein NSLog Output der von einer Website zugeschickt wird, nun möchte ich die vier(eigentlich sind es 30, habe hier nur vier erwähnt da das Prinzip ja das selbe sein wird) Variablen in ein Text Field schreiben lassen. Was ist da nun die einfachste Möglichkeit. Habe es schon mit dem XMLParser probiert nur ist es mir nicht gelungen das umzuschreiben, sodass es nicht in ein TableView geschrieben wird. Ich hoffe ihr könnt mir helfen ;)
    Vielen Dank für jegliche Hilfe
    Masel

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <todo>
    3. <buchungsnummer>246245</buchungsnummer>
    4. <nachname>NAME</nachname>
    5. <handynummer>0151</handynummer>
    6. <fahrzeug>LKW</fahrzeug>
    7. </todo>
  • xmlparser

    dann kannst du mit elementStart , elementEnd etc. die inhalte der elemente "rausziehen" dann kannst du die in ein Dictionary packen Elementname = key und inhalt = wert und entsprechend kannst du die sachen dann auch abfragen und in deine textfelder oder was anderes schreiben
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Ich habe immer noch keine Lösung gefunden, hier mal mein Code mit der Fehlermeldung vielleicht seht ihr ja was ich falsch mache ich bin so langsam am ende....
    :(


    [u]XMLParser.h
    [/u]#import <UIKit/UIKit.h>

    Quellcode

    1. @class AppDelegate, Buchung;
    2. @interface XMLParser : NSObject {
    3. NSMutableString *currentElementValue;
    4. AppDelegate *appDelegate;
    5. Buchung *aBuchung;
    6. }
    7. - (XMLParser *) initXMLParser;
    8. @end
    Alles anzeigen




    [u]XMLParser.m
    [/u]
    #import "XMLParser.h"

    Quellcode

    1. #import "AppDelegate.h"
    2. #import "Buchung.h"
    3. @implementation XMLParser
    4. - (XMLParser *) initXMLParser {
    5. self = [super init];
    6. appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    7. return self;
    8. }
    9. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    10. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    11. attributes:(NSDictionary *)attributeDict {
    12. if([elementName isEqualToString:@"todo"]) {
    13. appDelegate.buchungen = [[NSMutableArray alloc] init];
    14. //Initialize the book.
    15. aBuchung = [[Buchung alloc] init];
    16. //Extract the attribute here.
    17. aBuchung.buchungsnummerID = [[attributeDict objectForKey:@"id"] integerValue];
    18. NSLog(@"Reading id value :%@", aBuchung.buchungsnummerID);
    19. }
    20. NSLog(@"Processing Element: %@", elementName);
    21. }
    22. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    23. if(!currentElementValue)
    24. currentElementValue = [[NSMutableString alloc] initWithString:string];
    25. else
    26. [currentElementValue appendString:string];
    27. NSLog(@"Processing Value: %@", currentElementValue);
    28. }
    29. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    30. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    31. if([elementName isEqualToString:@"todo"]) {
    32. [appDelegate.buchungen addObject:aBuchung];
    33. //[aBuchung release];
    34. aBuchung = nil;
    35. }
    36. else
    37. [aBuchung setValue:currentElementValue forKey:elementName];
    38. //[currentElementValue release];
    39. currentElementValue = nil;
    40. }
    41. - (void) dealloc {
    42. // [aBuchung release];
    43. // [currentElementValue release];
    44. // [super dealloc];
    45. }
    46. @end
    Alles anzeigen




    Buchung.h

    Quellcode

    1. @interface Buchung : NSObject {
    2. NSInteger buchungsnummerID;
    3. NSString *nachname; //Same name as the Entity Name.
    4. NSString *handynummer; //Same name as the Entity Name.
    5. NSString *fahrzeug; //Same name as the Entity Name.
    6. NSString *kennzeichen; //Same name as the Entity Name.
    7. NSString *abstellplatz; //Same name as the Entity Name.
    8. NSString *handgepack; //Same name as the Entity Name.
    9. NSString *kfzdat; //Same name as the Entity Name.
    10. NSString *kfzzeit; //Same name as the Entity Name.
    11. NSString *flugnr; //Same name as the Entity Name.
    12. NSString *terminal; //Same name as the Entity Name.
    13. NSString *gegkfzdat; //Same name as the Entity Name.
    14. NSString *gegkfzzeit; //Same name as the Entity Name.
    15. NSString *gegflugnr; //Same name as the Entity Name.
    16. NSString *gegterminal; //Same name as the Entity Name.
    17. NSString *preis; //Same name as the Entity Name.
    18. NSString *halle; //Same name as the Entity Name.
    19. NSString *pflege; //Same name as the Entity Name.
    20. NSString *gesamt; //Same name as the Entity Name.
    21. NSString *gegpreis; //Same name as the Entity Name.
    22. NSString *geghalle; //Same name as the Entity Name.
    23. NSString *gegpflege; //Same name as the Entity Name.
    24. NSString *geggesamt; //Same name as the Entity Name.
    25. }
    26. @property (nonatomic, readwrite) NSInteger buchungsnummerID;
    27. @property (nonatomic, retain) NSString *nachname;
    28. @property (nonatomic, retain) NSString *handynummer;
    29. @property (nonatomic, retain) NSString *fahrzeug;
    30. @property (nonatomic, retain) NSString *kennzeichen;
    31. @property (nonatomic, retain) NSString *abstellplatz;
    32. @property (nonatomic, retain) NSString *handgepack;
    33. @property (nonatomic, retain) NSString *kfzdat;
    34. @property (nonatomic, retain) NSString *kfzzeit;
    35. @property (nonatomic, retain) NSString *flugnr;
    36. @property (nonatomic, retain) NSString *terminal;
    37. @property (nonatomic, retain) NSString *gegkfzdat;
    38. @property (nonatomic, retain) NSString *gegkfzzeit;
    39. @property (nonatomic, retain) NSString *gegflugnr;
    40. @property (nonatomic, retain) NSString *gegterminal;
    41. @property (nonatomic, retain) NSString *preis;
    42. @property (nonatomic, retain) NSString *halle;
    43. @property (nonatomic, retain) NSString *pflege;
    44. @property (nonatomic, retain) NSString *gesamt;
    45. @property (nonatomic, retain) NSString *gegpreis;
    46. @property (nonatomic, retain) NSString *geghalle;
    47. @property (nonatomic, retain) NSString *gegpflege;
    48. @property (nonatomic, retain) NSString *geggesamt;
    49. @end
    Alles anzeigen


    [u]

    Buchung.m[/u]

    Quellcode

    1. #import "Buchung.h"
    2. @implementation Buchung;
    3. @synthesize buchungsnummerID,nachname,handynummer,fahrzeug,kennzeichen,abstellplatz,handgepack,kfzdat,kfzzeit,flugnr,terminal,gegkfzdat,gegkfzzeit,gegflugnr,gegterminal,preis,halle,pflege,gesamt,gegpreis,geghalle,gegpflege,geggesamt;
    4. @end

    ViewController.m

    Quellcode

    1. #import "ViewController.h"
    2. #import "AppDelegate.h"
    3. #import "XMLParser.h"
    4. #import "Buchung.h"
    5. @implementation ViewController

    ...

    Quellcode

    1. NSData *data = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
    2. NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    3. //Initialize the delegate.
    4. XMLParser *parser = [[XMLParser alloc] initXMLParser];
    5. //Set delegate
    6. [xmlParser setDelegate:parser]; //Fehlermeldung: Sending 'XMLParser*' to parameter of incompatible type 'id<NSXMLPArserDelegate>'
    7. //Start parsing the XML file.
    8. BOOL success = [xmlParser parse]; //Fehlermeldung: Unused variable success
    9. buchungsnummer.text = [NSString stringWithFormat:@"%@",aBuchung.buchungsnummerID; //Fehlermeldung USe of undeclared identifier 'aBuchung'; did you mean Buchung?
    Alles anzeigen


    Ich hoffe ihr habt noch eine Idee zu meinem Problem

    Masel
  • Also erstmal zu dem Fehler


    /Set delegate
    [xmlParser setDelegate:parser]; //Fehlermeldung: Sending 'XMLParser*' to parameter of incompatible type 'id<NSXMLPArserDelegate>'

    Dein xmlparser also deine Datei entspricht nicht dem Protokoll nsxmlparser!


    Eine andere Möglichkeit, find ich schöner, in der Init-Methode von XMLparser den Parser zu initialisieren und zu starten

    Quellcode

    1. - (XMLParser *) initXMLParser {
    2. self = [super init];
    3. if( self)
    4. {// ... vorher xmlString nach NSDate umwandeln!!!
    5. NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    6. [parser setDelegate:self];
    7. [parser parse];
    8. }
    9. return self;
    10. }
    Alles anzeigen
    LG Thomas

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

  • ich bin mittlerweile ein großes Stück weiter doch hänge ich jetzt an dem ausgeben des NSMutableArrays, hier mein Quellcode

    Quellcode

    1. NSData *data = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
    2. NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    3. //Initialize the delegate.
    4. XMLParser *parser = [[XMLParser alloc] initXMLParser];
    5. //Set delegate
    6. [xmlParser setDelegate:parser];
    7. //Start parsing the XML file.
    8. BOOL success = [xmlParser parse];
    9. if(success)
    10. NSLog(@"No Errors");
    11. else {
    12. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fehler"
    13. message:@"Verbindung zum Server ist leider fehlgeschlagen!"
    14. delegate:nil
    15. cancelButtonTitle:@"OK"
    16. otherButtonTitles: nil];
    17. [alert show];
    18. [alert release];
    19. NSLog(@"FEHLER");
    20. }
    21. Buchung *aBuchung = [appDelegate.buchungen objectAtIndex:0];
    22. NSLog(@"test: %@",aBuchung.nachname);
    23. buchungsnummer.text =[NSString stringWithFormat:@"%@",aBuchung.buchungsnummer];
    24. nachname.text = [NSString stringWithFormat:@"%@",aBuchung.nachname];
    25. handynummer.text = [NSString stringWithFormat:@"%@",aBuchung.handynummer];
    26. fahrzeug.text = [NSString stringWithFormat:@"%@",aBuchung.fahrzeug];
    27. kennzeichen.text = [NSString stringWithFormat:@"%@",aBuchung.kennzeichen];
    Alles anzeigen



    egal was ich tue ich bekomm immer (null) als Ausgabe. Bin mir auch nicht so sicher was hinter objectAtIndex stehen muss, da da normalerweise indexpath.row steht, ich ja aber die Daten nicht in einer Tabelle ausgeben will, kann ich auch nicht auf diese Variable zugreifen...Das mit dem Parsen klappt alles gut ich bekomm die Elemente und die Values im NSlog angezeigt und in der XMLParser.m Datei kann ich auch auf das aBuchung Array zugreifen nur eben nicht in der ViewController.m

    hier noch der Kopf der ViewController.m Datei:

    Quellcode

    1. #import <QuartzCore/QuartzCore.h>
    2. #import "ViewController.h"
    3. #import "AppDelegate.h"
    4. #import "XMLParser.h"
    5. #import "Buchung.h"
    6. #import "ASIHTTPRequest.h"
    7. #import <AssetsLibrary/AssetsLibrary.h>
    8. @implementation ViewController;
    9. @synthesize sucher;
    Alles anzeigen



    also ich glaube daran soll es nicht liegen... :(
  • Was willst du denn mit einer Subklasse? 8|

    Composition over Inheritance, echt jetzt, Junge.

    C-Quellcode

    1. NSError * loadingError = nil;
    2. NSXMLDocument * xmlFile = [NSXMLDocument alloc] initWithData:data options:NSXMLDocumentTidyXML error:&loadingError];
    3. // Läd dir das gesamte Dokument in den Speicher oder gibt nen Fehler zurück.
    4. if(loadingError == nil)
    5. {
    6. for(NSXMLElement * subItem in [[xmlFile rootElement] children])
    7. {
    8. // Stottert nacheinander die Elemente <buchungsnummer>, <nachname>,<handynummer> und <fahrzeug> ab, wobei die Reihenfolge NICHT festgelegt ist.
    9. NSLog(@"Element %@, Wert", [subItem name], [subItem stringValue]);
    10. }
    11. }
    Alles anzeigen


    Schon kannst du via Stringvergleich (nein, nicht [subItem name] == @"fahrzeug"!) schauen welches Element du hast und dessen Wert beispielsweise wie [subItem objectValue] sichern.
    Natürlich musst du bei komplexeren XML-Strukturen verschachteln oder gleich mit Rekursion arbeiten.

    Ich weiß, das ist keine Lösung für dein eigentliches Problem. Bei den zu erwartenden Seiteneffekten habe ich allerdings auch keine Lust, dir dabei zu helfen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Masel92 schrieb:

    Das mit dem Parsen klappt alles gut ich bekomm die Elemente und die Values im NSlog angezeigt und in der XMLParser.m Datei kann ich auch auf das aBuchung Array zugreifen nur eben nicht in der ViewController.m

    Deine XMLParser Klasse muss dann ja das Array an das AppDelegate übergeben. Hast Du das vielleicht vergessen?
    Und noch ein Tipp. Wähle Deine Variablen- und Klassennamen mal geschickter. Wenn man mal diese eine Zeile hier betrachtet:

    [xmlParser setDelegate:parser];

    dann kommt einem das komisch vor. Wieso sollte ein Parser das Delegate eines Parsers sein? Lesbaren Code zu schreiben heißt auch die verwendeten Namen mit Bedacht zu wählen.

    Michael
  • Michael schrieb:

    Lucas de Vil schrieb:

    Was willst du denn mit einer Subklasse? 8|

    Und was willst Du jetzt mit einem komplett anderem Ansatz, der unter iOS mangels der Klasse NSXMLDocument für die Tonne ist?

    Och nöö, dieses verdammte iOS. -.- In dem Fall ziehe ich mein vorheriges Geseier demütig zurück.

    Masel
    In der XMLParser.m kommst du an die Buchung ran, im ViewController nicht?
    Wie versuchst du denn, in der ViewController.m darauf zuzugreifen?

    Und um noch einmal auf Composition over Inheritance herumzureiten: wozu diese eigene XMLParser Klasse?
    Du hättest die zum Protokoll gehörenden Methoden auch im ViewController.m implementieren und das als Delegate übergeben können.
    Dann hättest du keinen Umweg drin, um an deine Buchung zu kommen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Schonmal Vielen Dank. :thumbsup:

    Michael schrieb:

    Deine XMLParser Klasse muss dann ja das Array an das AppDelegate übergeben. Hast Du das vielleicht vergessen?
    Meine XMLParser.m Datei sieht wie folgt aus:

    Quellcode

    1. #import "XMLParser.h"
    2. #import "AppDelegate.h"
    3. #import "Buchung.h"
    4. @implementation XMLParser
    5. - (XMLParser *) initXMLParser {
    6. [super init];
    7. appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    8. return self;
    9. }
    10. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    11. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    12. attributes:(NSDictionary *)attributeDict {
    13. if([elementName isEqualToString:@"todon"]) {
    14. //Initialize the array.
    15. appDelegate.buchungen = [[NSMutableArray alloc] init];
    16. }
    17. else if([elementName isEqualToString:@"todo"]) {
    18. //Initialize the book.
    19. aBuchung = [[Buchung alloc] init];
    20. //Extract the attribute here.
    21. aBuchung.todoID = [[attributeDict objectForKey:@"id"] integerValue];
    22. NSLog(@"Reading id value :%i", aBuchung.todoID);
    23. }
    24. NSLog(@"Processing Element: %@", elementName);
    25. }
    26. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    27. if(!currentElementValue)
    28. currentElementValue = [[NSMutableString alloc] initWithString:string];
    29. else
    30. [currentElementValue appendString:string];
    31. NSLog(@"Processing Value: %@", currentElementValue);
    32. }
    33. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    34. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    35. if([elementName isEqualToString:@"todon"])
    36. return;
    37. if([elementName isEqualToString:@"todo"]) {
    38. [appDelegate.buchungen addObject:aBuchung];
    39. [aBuchung release];
    40. aBuchung = nil;
    41. }
    42. else {
    43. [aBuchung setValue:currentElementValue forKey:elementName];
    44. }
    45. [currentElementValue release];
    46. currentElementValue = nil;
    47. }
    48. - (void) dealloc {
    49. [aBuchung release];
    50. [currentElementValue release];
    51. [super dealloc];
    52. }
    53. @end
    Alles anzeigen


    Habe so gut wie alles von dieser Seite hier (Link:iphonesdkarticles.com/2008/12/parsing-xml-files.html) und dann auf meine Bedürfnisse angepasst und ja, die Variablennamen nicht großartig geändert. :rolleyes:
  • Habe es auch noch so probiert führt aber zu dem selbem Ergebnis/Misserfolg Ausgabe: (null)

    ViewController.h

    Quellcode

    1. @class AppDelegate, Buchung;
    2. @interface ViewController : UIViewController {
    3. AppDelegate *appDelegate;
    4. Buchung *aBuchung;}



    ViewController.m

    Quellcode

    1. #import <QuartzCore/QuartzCore.h>
    2. #import "ViewController.h"
    3. #import "AppDelegate.h"
    4. #import "XMLParser.h"
    5. #import "Buchung.h"
    6. #import "ASIHTTPRequest.h"
    7. #import <AssetsLibrary/AssetsLibrary.h>
    8. @implementation ViewController;
    9. @synthesize sucher;
    10. @synthesize aBuchung;
    11. buchungsnummer.text =[NSString stringWithFormat:@"%@",aBuchung.buchungsnummer];
    Alles anzeigen


    Alles nur Ausschnitte des Codes.
  • Masel92 schrieb:

    Habe so gut wie alles von dieser Seite hier (Link:iphonesdkarticles.com/2008/12…-xml-files.html) und dann auf meine Bedürfnisse angepasst

    Das ist keine gute Art, etwas zu lernen. Du solltest schon verstehen, wie der Parser grundsätzlich arbeitet. Copy-Paste und ein bisschen Anpassen führt, wie Du siehst, nicht dazu, dass Du weißt was Du machst. Dein Problem wird dieser Codeteil sein:

    Quellcode

    1. if([elementName isEqualToString:@"todon"]) {
    2. //Initialize the array.
    3. appDelegate.buchungen = [[NSMutableArray alloc] init];
    4. }

    Hier erzeugst Du das Array. Ich sehe in Deiner XML-Datei aber kein Element mit dem Namen 'todon'. Daher wird das Array auch nie erzeugt und deshalb bekommst Du auch immer nur ein (null) ausgegeben.

    Michael
  • Michael schrieb:

    Hier erzeugst Du das Array. Ich sehe in Deiner XML-Datei aber kein Element mit dem Namen 'todon'. Daher wird das Array auch nie erzeugt und deshalb bekommst Du auch immer nur ein (null) ausgegeben.
    Oh sorry mein Fehler ich hab die aktuelle xml. Datei nicht gepostet... Aber das parsen funktioniert alles soweit
    hier ein Log ausschnitt:

    Quellcode

    1. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Element: todon
    2. 2012-05-16 20:50:01.943 AppXML[350:1a303] Reading id value :1
    3. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Element: todo
    4. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Element: buchungsnummer
    5. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Value: 246100
    6. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Element: nachname
    7. 2012-05-16 20:50:01.943 AppXML[350:1a303] Processing Value: Mustermann
    8. 2012-05-16 20:50:01.944 AppXML[350:1a303] Processing Element: handynummer
    9. 2012-05-16 20:50:01.944 AppXML[350:1a303] Processing Value: 0151



    Die Variablen werden auch in das Array eingetragen nur hab ich keinen Zugriff von der ViewController.m auf das Array :(
  • Meinst du damit das ?


    ViewController.h

    Brainfuck-Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import <QuartzCore/QuartzCore.h>
    3. @class AppDelegate, Buchung; <------------ ?(
    4. @interface ViewController : UIViewController {
    5. AppDelegate *appDelegate;
    6. Buchung *aBuchung;
    Alles anzeigen