2009-08-25 1 views
0

Я работаю с API, где я получаю ответ обратно это это, и я хочу, чтобы разобрать целочисленный идентификатор из него:Как бы вы проанализировали целое число из этого ответа XML в Obj C?

<?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 и затем проанализировал текстовое содержимое. –

ответ

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 –

-1

Проверьте «NSScanner». Это было бы идеально для этого.

-2

Вы должны использовать библиотеку XML для этого, поскольку есть много случаев, когда код изменится Например, в данном случае, что произойдет, если <?xml декларация не передается или изменения кодировки из UTF-8 или Сомон добавляет пространство перед поездкой элемента

Во всех этих случаях поставщик файла может сказать, что файл является правильным

и т.д.

с XML разбором все это было сделано, и ваш код является более надежным

Также в этом случае код для разбора и поиска достаточно прост.

0

Если вы действительно не хотите использовать XML-парсер для создания подходящего объекта, почему бы не использовать регулярное выражение <trip>\d*</trip> для соответствия элементу? Затем вы можете получить целую часть, удалив начальный и конечный тег и разбор, чтобы обеспечить правильность, как с любой строкой.

Это удобное место для тестирования регулярных выражений; http://regexlib.com/RETester.aspx

Смежные вопросы