gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:34:43 27 4
gpt4 key购买 nike

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

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

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

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

最好的方法是什么?我能否以某种方式只填充 NSDictionary 或其他东西,然后在构建表格单元格时按键检索项目?

我似乎无法找出处理此问题的最佳方法。

提前致谢!

最佳答案

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

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

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

以下假定以下 ivars:

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

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

- (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];
}

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com