如何在不与新闻条目的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”)。但我需要以某种方式区分。但是如何?
答案 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源。
所以我没有对它进行测试,因为该频道只有一个类别。所以我不必要求频道标题,只显示特定频道的已定义类别。但我认为这应该有用。