2010-08-26 77 views
0

如何在不与新闻项目的标题元素发生冲突的情况下提取RSS频道的标题?使用NSXMLParser从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”)。但我需要某种区别。但是如何?

回答

0

我发现另一实例,以支持不同的类别进料和I想出以下解决方案:

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

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

在* .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

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

在解析期间,如果找到起始元素为“Item”set flag = YES,并且在解析器didendElement方法中找到元素作为“标题”时,请检查该标志=是否。只有在YES时才存储。 ,同样在ParserDidEndElement中,当您再次将元素设置为“Item”时,设置flag = NO;

+0

我没有尝试过,但我认为使用一个标志可以工作。但目前我不明白它是如何支持两个不同的元素:频道和项目。但是该频道现在已经改变了格式,所以我无法尝试。感谢您的回答! – testing 2010-08-27 09:44:38