如何在Obj C中解析此XML响应中的整数?

时间:2009-08-25 11:13:26

标签: iphone objective-c cocoa-touch

我正在使用API​​,我得到了这个回复,我想从中解析整数ID:

<?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解析库来完成这项任务!

4 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

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

这是一个用于测试正则表达式的便利位置; http://regexlib.com/RETester.aspx

答案 2 :(得分:-1)

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

答案 3 :(得分:-2)

您应该使用XML库,因为在许多情况下代码会发生变化 例如,在这种情况下会发生什么 未发送<?xml声明或编码从UTF-8更改 或者somone在trip元素之前添加一个空格

在所有这些情况下,文件的提供者都可以说文件是正确的

使用XML解析完成所有这些并且您的代码更加健壮

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