2010-11-07 78 views
2

我正在解析XML文件并填充表视图。该XML有这样的格式:如何使用NSXMLParser解析多个XML标记

<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

事件驱动的XML解析是一种跳动,如果存在可用的DOM样式解析器,则从这里开始。 – 2010-11-07 19:04:09

回答

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 2010-11-07 20:59:29

+1

如果这正是你所需要的,随时接受答案。 ;) – imaginaryboy 2010-11-08 02:39:03

0

我的用户DOM解析器,它是清洁的,如果你不解析的容易得多touchXML数据..建议谷歌的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);