Как бы вы проанализировали целое число из этого XML-ответа в Obj C? - PullRequest
0 голосов
/ 25 августа 2009

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

<?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 ]

4 голосов
/ 25 августа 2009

Я бы использовал парсер 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 голосов
/ 25 августа 2009

Для этого следует использовать библиотеку XML, так как во многих случаях код меняется Например, в этом случае, что произойдет, если Объявление <?xml не отправлено или кодировка меняется с UTF-8 или сомоне добавляет пробел перед элементом отключения

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

и т.д.

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

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

0 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...