2009-08-25 3 views
0

ich mit einer API arbeite, wo ich eine Antwort dieser dies zu umgehen, und ich möchte aus ihm die ganze Zahl ID analysieren:Wie würden Sie die Ganzzahl aus dieser XML-Antwort in Obj C analysieren?

<?xml version="1.0"?> 
<trip>328925</trip> 

Wie würden Sie diese analysieren? Ich habe einige wirklich zerbrechlich Code, den ich loswerden will, und ich würde ein paar Ratschläge zu schätzen wissen:

if ([[response substringWithRange:NSMakeRange(0, 21)] 
    isEqualToString: @"<?xml version=\"1.0\"?>"]) { 

    self.tripId = [response substringWithRange:NSMakeRange(28, response.length-35)]; 
} 

Ich glaube nicht, dass ich eine XML benötigen für diese Aufgabe Parsing-Bibliothek!

+2

Ja Sie tun. Das Behandeln von XML als "nur eine Zeichenkette" ist ein sicherer Weg, um Fehler einzuführen, da es in XML viele Möglichkeiten gibt, semantisch äquivalente Dokumente zu serialisieren. Wenn der Hersteller des Dokuments eine Namespace-Referenz, eine Schemareferenz oder sogar eine Inhaltscodierung hinzufügt, wird die obige Methode unterbrochen. Ich würde eine gute XML-Bibliothek finden, den Knoten mit XPath/XQuery auswählen und dann den Textinhalt analysieren. –

Antwort

4

Ich würde einen XML-Parser verwenden. Die Verwendung eines XML-Parsers ist der beste Weg, um XML zu parsen.

Es ist nicht schwer, entweder zu tun:

// Parser Delegate 
@interface ParserDelegate : NSObject { 
    int inTripElements; 
    NSMutableString* trip; 
} 
@property (readonly) NSMutableString* trip; 
@end 

@implementation ParserDelegate 

@synthesize trip; 

- (id) init { 
    if (![super init]) { 
     [self release]; 
     return nil; 
    } 
    trip = [@"" mutableCopy]; 
    return self; 
} 

- (void) parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"trip"]) { 
     ++inTripElements; 
    } 
} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (inTripElements > 0) { 
     [trip appendString:string];   
    } 
} 

- (void) parser:(NSXMLParser *)parser 
    didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"trip"]) { 
     --inTripElements; 
    } 
} 

@end 


// Parsing 
NSString* toParse = @"<?xml version=\"1.0\"?>" 
          "<trip>328925</trip>"; 

NSData* data = [NSData dataWithBytes:[toParse UTF8String] 
           length:strlen([toParse UTF8String])]; 

ParserDelegate* parserDelegate = [[ParserDelegate alloc] init]; 
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data]; 

[parser setDelegate:parserDelegate]; 
[parser parse]; 
[parser release]; 

NSLog(@"trip=%@", parserDelegate.trip); 
[parserDelegate release]; 
+0

Danke, deine Antwort ist perfekt. Ich habe in der Zwischenzeit tatsächlich ein Tutorial gefunden, das mich dazu brachte, den gleichen Code zu schreiben: http://weblog.bignerdranch.com/?p=48 –

-1

Schauen Sie sich 'NSScanner' an. Es wäre perfekt dafür.

-2

Sie sollten eine XML-Bibliothek für diesen Einsatz, da es viele Fälle, in denen der Code Zum Beispiel in diesem Fall ändern wird, was die <?xml Erklärung, wenn geschieht nicht oder die Codierung Änderungen von UTF-8 gesendet oder somone fügt ein Raum vor der Reise Element

In all diesen Fällen ist der Anbieter der Datei, um die Datei sagen kann, ist richtig

usw.

mit dem Parsen von XML all dies und Ihren Code getan wurde ist robuster

Auch in diesem Fall ist der Code zum Parsen und Finden ziemlich einfach.

0

Wenn Sie wirklich keinen XML-Parser verwenden möchten, um ein korrektes Objekt zu erstellen, warum verwenden Sie nicht den regulären Ausdruck <trip>\d*</trip>, um das Element zu finden? Dann können Sie den Integer-Teil erhalten, indem Sie das Start- und End-Tag und das Parsing entfernen, um sicherzustellen, dass es korrekt ist wie bei jeder anderen Zeichenkette.

Hier ist ein praktischer Ort zum Testen regulärer Ausdrücke; http://regexlib.com/RETester.aspx

Verwandte Themen