Вы можете использовать парсер DOM, если хотите, и это может немного облегчить вашу жизнь, но если по какой-то причине вы хотите придерживаться NSXMLParser, продолжайте читать.
Вы хотите, чтобы объект, который вы предоставляете синтаксическому анализатору в качестве вашего делегата (то, что реализует NSXMLParserDelegate), в основном накапливает данные при передаче данных.
ВАЖНАЯ ИНФОРМАЦИЯ, ЧАСТО ОБНАРУЖЕННАЯ: Для «содержимого» различных тегов вы можете фактически получить несколько вызовов на parser:foundCharacters:
. Нет абсолютно никакого требования, чтобы парсер передавал все это вам сразу. Если бы он захотел, он мог бы посылать вам по одному символу за раз, и вы должны были бы правильно с ним справиться.
Предполагается, что следующие ivars:
NSMutableArray articles_;
NSMutableString currentCharacters_;
Article currentArticle_; // Article has title and lastModified properties.
А вот пример того, как делегат может реализовать несколько релевантных сообщений (следующий код, очевидно, не обрабатывает ошибки):
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"article"]) {
NSAssert(currentArticle_ == nil, @"Uh oh! Bad XML!");
currentArticle_ = [[Article alloc] init];
return;
}
if ([elementName isEqualToString:@"title"]) {
NSAssert(currentCharacters_ == nil, @"Uh oh! Bad XML!");
currentCharacters_ = [[NSMutableString alloc] init];
return;
}
if ([elementName isEqualToString:@"last-modified"]) {
NSAssert(currentCharacters_ == nil, @"Uh oh! Bad XML!");
currentCharacters_ = [[NSMutableString alloc] init];
return;
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"article"]) {
[articles_ addObject:currentArticle_];
[currentArticle_ release], currentArticle_ = nil;
return;
}
if ([elementName isEqualToString:@"title"]) {
currentArticle_.title = currentCharacters_;
[currentCharacters_ release], currentCharacters_ = nil;
return;
}
if ([elementName isEqualToString:@"last-modified"]) {
[currentArticle_ setLastModifiedWithString:currentCharacters_];
[currentCharacters_ release], currentCharacters_ = nil;
return;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[currentCharacters_ appendString:string];
}