rph*_*ath 2 iphone objective-c nsxmlparser ios
我正在解析XML文件并填充表视图.XML的格式如下:
<article>
<title>Title 1</title>
<last-modified>MM/DD/YYY</last-modified>
</article>
...
Run Code Online (Sandbox Code Playgroud)
我目前使用它NSMutableString来收集所有文章标题并在- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法中附加字符串.然后在适当的时候,我正在添加articleTitle一个NSMutableArray包含所有文章标题,并从数组中填充表格,正如您所期望的那样.
但是,现在我想切换到使用带有字幕的表格视图单元格(我想将最后修改日期作为detailTextLabel标题和标题textLabel).通过将解析分解为多种方法(即2 parser种方法和foundCharacters方法)的方式,我不确定如何"收集"数据,并从该数据中填充表格.
对此最好的方法是什么?我可以以某种方式填充NSDictionary或其他东西,并在构建表格单元格时按键检索项目吗?
我似乎无法找出解决这个问题的最佳方法.
提前致谢!
如果你愿意,你可以使用DOM解析器,它可能会让你的生活更轻松,但如果由于某种原因你想坚持使用NSXMLParser,请继续阅读.
您希望将您提供解析器的对象作为您的委托(实现NSXMLParserDelegate的事物),以便在传递数据时基本上累积数据.
隐藏的重要细节:对于各种标签的"内容",您实际上可以接听多个电话parser:foundCharacters:.绝对没有要求解析器立刻将它全部交给您.如果它想,它可以一次向你发送一个字符,你必须妥善处理它.
以下假定以下ivars:
NSMutableArray articles_;
NSMutableString currentCharacters_;
Article currentArticle_; // Article has title and lastModified properties.
Run Code Online (Sandbox Code Playgroud)
以下是委托如何实现一些相关消息的示例(以下代码显然没有错误处理):
- (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];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3434 次 |
| 最近记录: |