开发者

NSXMLParser Parsing RSS into a Custom Object

I have my nsxmlparser parsing the news feed just fine:

http://www.skysports.com/rss/0,20514,12433,00.xml

However when it comes to saving it into my custom object, although I recieve output of each entry in the xml, it only stores one record which happens to开发者_Python百科 be the last one.

Please see my code:

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"rss"]) {
        currentNews = [[NewsParse alloc] init];
    }
}

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{



    if ([elementName isEqualToString:@"description"]) {
        currentNews.newsTitle = currentNodeContent;
        NSLog(@"description = %@",currentNodeContent);
    }



    if([elementName isEqualToString:@"rss"])
    {
        [news addObject:currentNews];
        [currentNews release];
        currentNews = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }

}

This method worked fine with a twitter feed but now i'm assuming because the xml is formed differently I cannot get it to work.

I'm still pretty new to using NSXMLParser so any help would be cool :)


Looking at the RSS feed it appears that you are looking for the wrong tag to begin and end your objects. You need to replace

[elementName isEqualToString:@"rss"]

with

[elementName isEqualToString:@"item"]

in both places. The way you are doing it now you are looking at the entire page as 1 object. You need to look at each "item" ( <item> </item> ) as an object. The reason why you are successfully getting the last object to save is because you replacing each "description" every time you run through your items. It is replacing the string over and over and over again before you actually save. The last object never gets replaced before saving and therefor the only object you see as saved..


Hmmm, currentNews.newsTitle is changed every time and once it reads the closing rss tag, it has the value of the last feed. What type of object is your currentNews? If you want to keep all different titles, then you have to add them to some sort of object that holds several values, like an array, when you find the closing tag of description simply copy the string for currentNodeContent into an individual instance of news.

I would actually allocate the instance of currentNews in the didEndElement tag outside any comparisson just in case you have more elements to look for. That closing tag probably like this:

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"title"]) {
        self.currentNews.newsTitle = [[NSString alloc] initWithString:currentNodeContent];
    }
    if ([elementName isEqualToString:@"description"]) {
        self.currentNews.newsDescription = [[NSString alloc] initWithString:currentNodeContent];
    }
    if ([elementName isEqqualToString:@"link"]) {
        self.currentNews.newsLink = [[NSString alloc] initWithString:currentNodeContent];
    }
    if ([elementName isEqualToString:@"guid"]) {
        self.currentNews.newsGuid = [[NSString alloc] initWithString:currentNodeContent];
    }
    if ([elementName isEqualToString:@"pubDate"]) {
        self.currentNews.newsPubDate = "probably a date formatter here";
    }
    if ([elementName isEqualToString:@"cathegory"]) {
        self.currentNews.newsCathegory = [[NSString alloc] initWithString:currentNodeContent];
    }
    blah...
    blah...
    if ([elementName isEqualToString:@"item"]) {

        [news addObject:currentNews];

        [self.currentNews.newsTitle release];
        [self.currentNews.newsDescription release];
        [self.currentNews.newsLink release];
        [self.currentNews.newsGuid release];
        blah...
        blah...
        blah...
    }
}

And allocate your currentNews object in your init method (remove it from your didStartElement) and release it in your dealloc method. Oh, and @Louie is right, you need to look at your news as an array object which obviously has several currentNews, this currentNews or item is what your parser should be concerned about. After parsing all the element in "just one item" you add it to your news array when it reads the last element tag for that "one item", because after that your parser is simply going to loop and look for the next item.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜