2009-08-25 58 views
0

我用的API時,我得到響應這個這個,我想分析的整數ID出來的:如何解析Obj C中這個XML響應中的整數?

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

你會如何解析呢?我有一些非常脆弱的代碼,我想擺脫的,我會很感激一些建議:

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

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

我不認爲我需要一個XML解析庫完成這個任務!

+2

是你做的。將XML視爲「僅僅是一個字符串」是引入錯誤的一種可靠方法,因爲在XML中有許多方法來序列化語義上等同的文檔。如果文檔的生產者添加了名稱空間引用,作爲模式引用或者甚至內容編碼,上述方法將會中斷。我會找到一個好的XML庫,用XPath/XQuery選擇節點,然後解析文本內容。 – 2009-08-25 11:20:07

回答

4

我會使用XML解析器。使用XML解析器確實是解析XML的最佳方式。

這並不難做到之一:

// 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

謝謝,你的回答是完美的。實際上,我在同一時間找到了一個教程,這使我編寫了幾乎相同的代碼:http://weblog.bignerdranch.com/?p=48 – 2009-08-25 12:35:18

-1

查看'NSScanner'。這將是完美的。

-2

您應該使用XML庫這是有很多情況下,代碼將改變 例如,在這種情況下,如果 的<?xml聲明不發送或UTF-8編碼的變化 或有人爲增加會發生什麼旅行元素

前的空間在所有這些情況下,該文件的供應商可以說該文件是正確的

與XML解析這一切已經完成,你的代碼更強勁

同樣在這種情況下,解析和查找的代碼非常簡單。

0

如果您真的不想使用XML解析器創建適當的對象,爲什麼不使用正則表達式<trip>\d*</trip>來匹配元素?然後,您可以通過刪除開始和結束標記並解析來獲取整數部分,以確保與任何字符串一樣正確。

這是測試正則表達式的方便之處; http://regexlib.com/RETester.aspx