Извлечение названия RSS-канала в Cocoa-Touch - PullRequest
0 голосов
/ 08 января 2010

Я пытаюсь разобрать канал RSS XML. Я выяснил, как разобрать, что находится в тегах для отдельных историй, но я не могу понять, как получить название всего канала (например, «Канал новостей CNN»). Я думаю, что это и я попробовал кучу вещей, но я не могу понять это. Ниже приведена часть моего кода синтаксического анализа, который, как мне кажется, показался мне наиболее разумным, но не сработал. Кто-нибудь может помочь?

Спасибо !! GL

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentElement = [elementName copy];


    if ([elementName isEqualToString:@"item"] || [elementName isEqualToString:@"channel"]) {
        item = [[NSMutableDictionary alloc] init];
        currentTitle = [[NSMutableString alloc] init];
        currentDate = [[NSMutableString alloc] init];
        currentSummary = [[NSMutableString alloc] init];
        currentLink = [[NSMutableString alloc] init];
    }
}



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


    if ([elementName isEqualToString:@"channel"]) {
        // save values to an item, then store that item into the array...
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];

        [feedsArray addObject:[item copy]];
    }




    if ([elementName isEqualToString:@"item"]) {
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];

        [stories addObject:[item copy]];
        NSLog(@"adding story: %@", currentTitle);
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    if ([currentElement isEqualToString:@"title"]) {
        [currentTitle appendString:string];
    } else if ([currentElement isEqualToString:@"link"]) {
        [currentLink appendString:string];
    } else if ([currentElement isEqualToString:@"description"]) {
        [currentSummary appendString:string];
    } else if ([currentElement isEqualToString:@"pubDate"]) {
        [currentDate appendString:string];
    }
}

Ответы [ 3 ]

0 голосов
/ 08 января 2010

Имя фида всегда включается в название заголовка через «-» в конце. Теперь, если вы хотите получить название канала, вы можете сделать это следующим образом.

NSDictionary *feedDict = [feedArray objectAtIndex:indexPath.row];
UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:1];
NSArray *tempArr = [[NSArray alloc] initWithArray:[[feedDict valueForKey:@"title"] componentsSeparatedByString:@" - "]];
[lbl setText:[tempArr objectAtIndex:0]];

Таким образом, вы увидите название корма в ярлыке.

Надеюсь, это поможет.

Спасибо

Madhup

0 голосов
/ 21 июля 2010

Я выпустил открытый исходный код RSS / Atom Parser для iPhone , и он делает чтение и анализ веб-каналов чрезвычайно простым.

Вы можете настроить его на чтение только информации о канале (заголовок, сводка и т. Д.), Если хотите. Ознакомьтесь с документацией и поиграйтесь с демо-приложением. Надеюсь, это поможет!

0 голосов
/ 08 января 2010

Заголовок ленты находится за пределами items и channels, поэтому вам также следует активировать title in didStartElement. Вам также может понадобиться сделать некоторую логику, чтобы различать titles в items и channels и глобальный title.

Давайте попробуем исправить это ... (также заметил некоторые возможные утечки памяти)

Не проверено

- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict {

    if (currentElement)
        [currentElement release];
    currentElement = [elementName copy];

    if ([elementName isEqualToString:@"item"] || 
        [elementName isEqualToString:@"channel"]) {

        if (item)
            [item release];
        item = [[NSMutableDictionary alloc] init];
        currentTitle = [[NSMutableString alloc] init];
        currentDate = [[NSMutableString alloc] init];
        currentSummary = [[NSMutableString alloc] init];
        currentLink = [[NSMutableString alloc] init];

    } else if (!item && [elementName isEqualToString:@"title"]) {

        [currentElement release];
        currentElement = [@"<GlobalTitle>" copy];

    }
}

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

    if ([elementName isEqualToString:@"channel"]) {
        // save values to an item, then store that item into the array...
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];
        [feedsArray addObject:item]; // item will be retained by array
        [item release];
        [currentTitle release]; // these are also retained by the dictionary
        [currentLink release];
        [currentSummary release];
        [currentDate release];
        item = nil;
        currentTitle = nil;
        currentLink = nil;
        currentSummary = nil;
        currentDate = nil;
    }

    if ([elementName isEqualToString:@"item"]) {
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];
        [stories addObject:item]; // item will be retained by array
        [item release];
        [currentTitle release]; // these are also retained by the dictionary
        [currentLink release];
        [currentSummary release];
        [currentDate release];
        item = nil;
        currentTitle = nil;
        currentLink = nil;
        currentSummary = nil;
        currentDate = nil;
        NSLog(@"adding story: %@", currentTitle);
    }
}

- (void)parser:(NSXMLParser *)parser 
foundCharacters:(NSString *)string {

    if ([currentElement isEqualToString:@"title"]) {
        [currentTitle appendString:string];
    } else if ([currentElement isEqualToString:@"link"]) {
        [currentLink appendString:string];
    } else if ([currentElement isEqualToString:@"description"]) {
        [currentSummary appendString:string];
    } else if ([currentElement isEqualToString:@"pubDate"]) {
        [currentDate appendString:string];
    } else if ([currentElement isEqualToString:@"<GlobalTitle>"]) {
        self.feedTitle = string; // The feeds title is saved here
    }
}
...