Извлечение названия канала из RSS-канала с использованием NSXMLParser - PullRequest
0 голосов
/ 26 августа 2010

как извлечь заголовок канала RSS, не вступая в конфликт с элементом заголовка новости?

Если элемент был найден:

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

   if ([elementName isEqualToString:@"channel") {
       [currentChannel release];
       currentChannel = nil;

       currentChannel = [[NSMutableString alloc] init];
   }

   if ([elementName isEqualToString:@"item"]) {
      ...
      }
   }

Если был найден конечный тег:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
   if ([elementName isEqualToString:@"channel") {
       [channel setObject:currentChannelTitle forKey:@"title"];
   }

   if ([elementName isEqualToString:@"item"]) {
       ...
   }

Выполнить разбор вещей:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
   string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
   if ([currentElement isEqualToString:@"title") {
        [currentChannelTitle appendString:string forKey:@"title"];
   }

   if ([currentElement isEqualToString:@"title"]) {
        [currentTitle appendString:string];
   }
    ...
   }

И в последней части у меня проблема. У меня есть два атрибута "заголовок". Один для элемента «канал» и один для его дочернего элемента («элемент»). Но мне нужно различие как-то. Но как?

Ответы [ 2 ]

0 голосов
/ 27 августа 2010

Я нашел другой пример для поддержки различных категорий каналов и нашел следующее решение:

Сначала объявите переменную в файле * .h.

@interface XMLParser : NSObject <NSXMLParserDelegate>{
    ...  
    NSMutableString * currentChannel;
}

Inфайл * .m синтезирует и выпускает переменную.В didStartElement спросите, над каким элементом вы сейчас работаете.Если это элемент канала, извлеките заголовок и сохраните его в объявленной выше переменной.

@implementation XMLParser

...
@synthesize currentChannel;

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

if ([elementName isEqualToString:@"item"]) {  
    ...
}

// title is an attribute of the element channel
if ([currentElement isEqualToString:@"channel"]) {
    [currentChannel appendString:[attributeDict objectForKey:@"title"]];
}  

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"item"]) {  
    ...

    if ([currentChannel isEqualToString:@"Your Channel Name"]) {
        if ([currentCategory isEqualToString:@"Your category name"]) {
            [items addObject:[item copy]];
        }
    } else {
        [items addObject:[item copy]];
    }
}  
}  

В didEndElement спросите, принадлежит ли элемент определенному каналу,и если затем добавить его, только если это определенная категория.Таким образом, вы можете добавлять / показывать только RSS-каналы, если они принадлежат к определенной категории.

Так что я не проверял это, потому что канал имеет только одну категорию.Поэтому мне не нужно запрашивать название канала, чтобы показывать только определенные категории из определенного канала.Но я думаю, что это должно сработать.

0 голосов
/ 26 августа 2010

я думаю, что вы хотите получить заголовок элемента, в этом случае в методе viewDidload возьмите одну переменную типа bool, скажем, flag, в методе viewDidload () set flag = NO;

, когда во время синтаксического анализа вы находите элемент запуска«Элемент» установить флаг = YES, и в методе синтаксического анализатора didendElement, когда вы нашли элемент как «Заголовок», установите флажок «Да» или нет.хранить только если это ДА.а также в ParserDidEndElement, когда вы находите элемент как «Item», снова устанавливаете flag = NO;

...