如何解析Obj C中这个XML响应中的整数?

问题描述:

我用的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

我会使用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

查看'NSScanner'。这将是完美的。

您应该使用XML库这是有很多情况下,代码将改变 例如,在这种情况下,如果 的<?xml声明不发送或UTF-8编码的变化 或有人为增加会发生什么旅行元素

前的空间在所有这些情况下,该文件的供应商可以说该文件是正确的

与XML解析这一切已经完成,你的代码更强劲

同样在这种情况下,解析和查找的代码非常简单。

如果您真的不想使用XML解析器创建适当的对象,为什么不使用正则表达式<trip>\d*</trip>来匹配元素?然后,您可以通过删除开始和结束标记并解析来获取整数部分,以确保与任何字符串一样正确。

这是测试正则表达式的方便之处; http://regexlib.com/RETester.aspx