如何解析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解析库完成这个任务!
我会使用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];
谢谢,你的回答是完美的。实际上,我在同一时间找到了一个教程,这使我编写了几乎相同的代码: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
是你做的。将XML视为“仅仅是一个字符串”是引入错误的一种可靠方法,因为在XML中有许多方法来序列化语义上等同的文档。如果文档的生产者添加了名称空间引用,作为模式引用或者甚至内容编码,上述方法将会中断。我会找到一个好的XML库,用XPath/XQuery选择节点,然后解析文本内容。 – 2009-08-25 11:20:07