2010-11-07 2 views
2

Я разбираю XML-файл и заполняю вид таблицы. XML имеет формат, как это:Как анализировать несколько тегов XML, используя NSXMLParser

<article> 
    <title>Title 1</title> 
    <last-modified>MM/DD/YYY</last-modified> 
</article> 
... 

я в настоящее время он работает с помощью NSMutableString собрать все заголовки статей и добавление строк в методе - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string. Затем в подходящее время я добавляю articleTitle в NSMutableArray, который содержит все заголовки статей и заполняет таблицу из массива, как и следовало ожидать.

Однако теперь я хочу переключиться на использование ячейки таблицы, содержащей субтитры (я хочу поставить дату последнего изменения как detailTextLabel и заголовок как textLabel). Поскольку разбор разделяется на несколько методов (т. Е. Методы 2 parser и метод foundCharacters), я не уверен, как мне следует собирать данные и заполнять таблицу из этих данных.

Каков наилучший подход для этого? Могу ли я как-то просто заполнить NSDictionary или что-то еще, и просто получить элементы по ключу при построении ячеек таблицы?

Я не могу понять, как лучше всего справиться с этим.

Заранее благодарен!

+0

события -driven Разбор XML - это избиение, если есть доступный парсер DOM, начинайте с него. –

ответ

5

Вы можете пойти с парсером DOM, если хотите, и это может сделать вашу жизнь немного легче, но если по какой-то причине вы хотите придерживаться NSXMLParser, продолжайте читать.

Вы хотите, чтобы объект, который вы передали парсеру в качестве вашего делегата (вещь, которая реализует NSXMLParserDelegate), в основном накапливает данные по мере передачи данных.

ВАЖНАЯ ИНФОРМАЦИЯ ОБРАТНАЯ СВЯЗЬ: Для «контента» различных тегов вы можете фактически получить несколько вызовов до parser:foundCharacters:. Нет абсолютно никакого требования, чтобы синтаксический анализатор передал вам все сразу. Если захочет, он может отправить вам по одному персонажу за раз, и вам придется правильно его обработать.

Нижеследующее предполагает следующий Ивар:

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]; 
} 
+0

Отлично, именно то, что мне нужно! Благодарю. – rpheath

+1

Если это именно то, что вам нужно, не стесняйтесь принять ответ. ;) – imaginaryboy

0

Я пользователь А DOM Parser, она чище, и проще, если вы не разбор много данные .. рекомендовать компании Google GDATA

здесь является StackOverflow Questio п на нем

NSError *error; 
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; 
if (doc == nil) { return nil; } 

// get number of hits 
GDataXMLElement * article = [[doc nodesForXPath:@"//article" error:nil] objectAtIndex:0]; 

// title 
NSLog([[[entry elementsForName:@"title"] objectAtIndex:0] stringValue]], nil); 

// last-modified 
NSLog([[[entry elementsForName:@"last-modified"] objectAtIndex:0] stringValue]], nil); 
Смежные вопросы