NSXMLParser Парсинг RSS в пользовательский объект - PullRequest
0 голосов
/ 13 июня 2011

У меня есть nsxmlparser, который очень хорошо разбирает ленту новостей:

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

Однако, когда дело доходит до сохранения его в моем пользовательском объекте, я получаю вывод каждой записи вxml, в нем хранится только одна запись, которая является последней.

Пожалуйста, посмотрите мой код:

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

}

Этот метод отлично работал с фидом в твиттере, но теперь я предполагаю, потому чтоxml сформирован по-другому, я не могу заставить его работать.

Я все еще довольно новичок в использовании NSXMLParser, поэтому любая помощь будет крутой:)

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

Хммм, currentNews.newsTitle меняется каждый раз, и как только он читает закрывающий тэг rss, он имеет значение последнего фида.Какой тип объекта у вас currentNews?Если вы хотите сохранить все разные заголовки, то вам нужно добавить их к какому-либо объекту, который содержит несколько значений, например массив, когда вы найдете закрывающий тег описания, просто скопируйте строку для currentNodeContent в отдельный экземпляр новостей.

Я бы фактически выделил экземпляр currentNews в теге didEndElement вне любого сравнения на тот случай, если у вас будет больше элементов для поиска.Этот закрывающий тег, вероятно, выглядит следующим образом:

-(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...
    }
}

И выделите ваш объект currentNews в вашем методе init (удалите его из didStartElement) и освободите его в вашем методе dealloc.Да, и @Louie прав, вам нужно смотреть на ваши новости как на объект массива, который, очевидно, имеет несколько currentNews, этот currentNews или элемент - это то, о чем должен беспокоиться ваш парсер.После анализа всего элемента в «только одном элементе» вы добавляете его в свой массив новостей, когда он читает последний тег элемента для этого «одного элемента», потому что после этого ваш анализатор просто будет зацикливаться и искать следующий элемент.

0 голосов
/ 13 июня 2011

Глядя на RSS-канал, вы обнаруживаете, что ищете неправильный тег для начала и окончания ваших объектов. Вам необходимо заменить

[elementName isEqualToString:@"rss"]

с

[elementName isEqualToString:@"item"]

в обоих местах. То, как вы делаете это сейчас, вы смотрите на всю страницу как на 1 объект. Вам нужно смотреть на каждый «предмет» (<item> </item>) как на объект. Причина, по которой вы успешно получаете последний объект для сохранения, заключается в том, что вы заменяете каждое «описание» каждый раз, когда просматриваете свои элементы. Это замена строки снова и снова и снова, прежде чем вы на самом деле сохранить. Последний объект никогда не заменяется перед сохранением, и поэтому единственный объект, который вы видите как сохраненный ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...