NSXMLParser仅从Feed中获取最后一个对象

时间:2013-12-19 14:26:06

标签: objective-c xml cocoa nsxmlparser

我是Objective C和Stack Overflow的新手。我正在尝试解析在线XML文档。 Feed有5个条目,每个条目看起来像这样:

<item>
<title>the title goes here</title>
<link>http://thelink.com</link>
<guid>http://thelink.com</guid>
<category>News</category>
<description/>
<pubDate>Wed, 20 Nov 2013 20:36:00 +0430</pubDate>
<author>newsFeedAsc</author>
</item>

顶级节点是:

<rss version="2.0">
<channel>
<title>feed RSS</title>
<link>Feedlink.com</link>
<description>...</description>
<language>fa-ir</language>
<pubDate/>
<lastBuildDate/>
<docs>......</docs>
<generator>.....</generator>
<ttl>5</ttl>
<image>
<title>RSS</title>
<url>
......images/ver2/rsslogo.gif
</url>
<link>.......</link>
</image>

我使用以下代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *urlString=@"http://thelink.thelink/api/news?news_type=2&limit=5";
    NSURL *url = [NSURL URLWithString:urlString];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    element = elementName;
    if ([element isEqualToString:@"item"])
    {
        item    = [[NSMutableDictionary alloc] init];
        title   = [[NSMutableString alloc] init];
        link    = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if ([element isEqualToString:@"title"]) {
        [title appendString:string];
    } else if ([element isEqualToString:@"link"]) {
        [link appendString:string];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"item"]) {
        [item setObject:title forKey:@"title"];
        [item setObject:link forKey:@"link"];
        [feeds addObject:[item copy]];
    }
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"%@",feeds);
}

现在,当我NSLog“feed”时,我得到一个空对象。当我NSLog“item”时,我得到了Feed的最后一个条目。如果我没错,整个XML树应该在“feed”中。

1 个答案:

答案 0 :(得分:2)

您似乎永远不会创建实例并将其分配给feeds,因此对于要添加的任何内容都不存在。因此,当您尝试添加每个item时,实际上只是将其丢弃(实际上,只有当您为下一个item创建新实例时)。这就是为什么你只有最后一项。

所以,基本上,一定要创建feeds数组,以便在某处存储结果。