使用NSXMLParser从RSS提要中提取频道标题

时间:2010-08-26 11:20:26

标签: iphone objective-c xcode rss nsxmlparser

如何在不与新闻条目的title元素冲突的情况下提取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];
   }
    ...
   }

在最后一部分我遇到了问题。我有两个“标题”属性。一个用于“channel”元素,另一个用于子元素(“item”)。但我需要以某种方式区分。但是如何?

2 个答案:

答案 0 :(得分:0)

我认为你想获得项目标题,在那种情况下在viewDidload方法中取一个bool类型变量say flag in viewDidload()方法set flag = NO;

在解析期间,您发现start元素为“Item”set flag = YES,而在解析器didendElement方法中,当您找到element为“Title”时,请检查flag = YES。只有在是的时候才存储。 还有在ParserDidEndElement中,当你发现元素为“Item”时再设置flag = NO;

答案 1 :(得分:0)

我找到另一个支持不同类别Feed的示例,我想出了以下解决方案:

首先在* .h文件中声明变量。

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

在* .m文件中合成并释放变量。在didStartElement中询问您当前正在处理哪个元素。如果它是一个channel元素,则提取标题并将其存储在上面声明的变量中。

@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源。

所以我没有对它进行测试,因为该频道只有一个类别。所以我不必要求频道标题,只显示特定频道的已定义类别。但我认为这应该有用。