• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iphone - 如何使用 NSXMLParser 解析多个 XML 标签

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:21:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在解析一个 XML 文件并填充一个表格 View 。 XML 的格式如下:

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

我目前使用 NSMutableString 收集所有文章标题并将字符串附加到 - (void)parserNSXMLParser *)parser foundCharactersNSString * )string 方法。然后在适当的时候,我将 articleTitle 添加到包含所有文章标题的 NSMutableArray 中,并按照您的预期从数组中填充表格。

但是,现在我想切换到使用具有副标题的表格 View 单元格(我想将最后修改日期作为 detailTextLabel 并将标题作为 textLabel)。通过将解析分成几个方法(即 2 个 parser 方法和 foundCharacters 方法)的方式,我不确定应该如何“收集”数据,并根据该数据填充表格。

最好的方法是什么?我可以以某种方式填写 NSDictionary 或其他内容,然后在构建表格单元格时按键检索项目吗?

我似乎想不出解决这个问题的最佳方法。

提前致谢!



Best Answer-推荐答案


如果你愿意,你可以使用 DOM 解析器,它可能会让你的生活更轻松,但如果出于某种原因你想坚持使用 NSXMLParser,请继续阅读。

你希望你给解析器的对象作为你的委托(delegate)(实现 NSXMLParserDelegate 的东西)基本上在传递数据时积累数据。

经常被忽视的重要细节:对于各种标签的“内容”,您实际上可以收到对 parser:foundCharacters: 的多次调用。绝对没有要求解析器一次将所有内容交给您。如果它愿意,它可以一次向您发送一个字符,而您必须妥善处理它。

以下假设有以下 ivars:

NSMutableArray articles_;
NSMutableString currentCharacters_;
Article currentArticle_; // Article has title and lastModified properties.

下面是委托(delegate)如何实现一些相关消息的示例(以下代码显然没有错误处理):

- (void)parserNSXMLParser *)parser didStartElementNSString *)elementName namespaceURINSString *)namespaceURI qualifiedNameNSString *)qName attributesNSDictionary *)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)parserNSXMLParser *)parser didEndElementNSString *)elementName namespaceURINSString *)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];
}

关于iphone - 如何使用 NSXMLParser 解析多个 XML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119086/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap