2012-07-27 56 views
0

我有一个RSS解析器的代码,但它无法读取CDATA。谁能告诉我,我有什么在后续的代码更改:RSS博客解析器无法读取CDATA


#import "BlogRssParser.h" 
#import "BlogRss.h" 

@implementation BlogRssParser 

@synthesize currentItem = _currentItem; 
@synthesize currentItemValue = _currentItemValue; 
@synthesize rssItems = _rssItems; 
@synthesize delegate = _delegate; 
@synthesize retrieverQueue = _retrieverQueue; 

- (id)init{ 
    if(![super init]){ 
     return nil; 
    } 
    _rssItems = [[NSMutableArray alloc]init]; 
    return self; 
} 

- (NSOperationQueue *)retrieverQueue { 
    if(nil == _retrieverQueue) { 
    _retrieverQueue = [[NSOperationQueue alloc] init]; 
    _retrieverQueue.maxConcurrentOperationCount = 1; 
} 
return _retrieverQueue; 
} 

- (void)startProcess{ 
SEL method = @selector(fetchAndParseRss); 
[[self rssItems] removeAllObjects]; 
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self 
                   selector:method 
                    object:nil]; 
[self.retrieverQueue addOperation:op]; 
[op release]; 
} 

-(BOOL)fetchAndParseRss{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

//To suppress the leak in NSXMLParser 
[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 

NSURL *url = [NSURL URLWithString:@"http://www.myfeed.com/feed"]; 
BOOL success = NO; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[parser setDelegate:self]; 
[parser setShouldProcessNamespaces:YES]; 
[parser setShouldReportNamespacePrefixes:YES]; 
[parser setShouldResolveExternalEntities:NO]; 
success = [parser parse]; 
[parser release]; 
[pool drain]; 
return success; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{ 
if(nil != qualifiedName){ 
    elementName = qualifiedName; 
} 
if ([elementName isEqualToString:@"item"]) { 
    self.currentItem = [[[BlogRss alloc]init]autorelease]; 
} else if([elementName isEqualToString:@"title"] || 
      [elementName isEqualToString:@"link"] || 
      [elementName isEqualToString:@"pubDate"] || 
      [elementName isEqualToString:@"guid"] || 
      [elementName isEqualToString:@"description"]) { 
    self.currentItemValue = [NSMutableString string]; 
} else { 
    self.currentItemValue = nil; 
} 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
if(nil != qName){ 
    elementName = qName; 
} 
if([elementName isEqualToString:@"title"]){ 
    self.currentItem.title = self.currentItemValue; 
}else if([elementName isEqualToString:@"link"]){ 
    self.currentItem.linkUrl = self.currentItemValue; 
}else if([elementName isEqualToString:@"pubDate"]){ 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 
    self.currentItem.pubDate = [formatter dateFromString:self.currentItemValue]; 
    [formatter release]; 
}else if([elementName isEqualToString:@"guid"]){ 
    self.currentItem.guidUrl = self.currentItemValue; 
}else if([elementName isEqualToString:@"description"]){ 
    self.currentItem.description = self.currentItemValue; 
}else if([elementName isEqualToString:@"item"]){ 
    [[self rssItems] addObject:self.currentItem]; 
} 
} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if(nil != self.currentItemValue){ 

    [self.currentItemValue appendString:string]; 
} 

} 

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{ 

// I think something here!?!? 

} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ 
if(parseError.code != NSXMLParserDelegateAbortedParseError) { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [(id)[self delegate] performSelectorOnMainThread:@selector(processHasErrors) 
              withObject:nil 
             waitUntilDone:NO]; 
} 
} 



- (void)parserDidEndDocument:(NSXMLParser *)parser { 
[(id)[self delegate] performSelectorOnMainThread:@selector(processCompleted) 
             withObject:nil 
            waitUntilDone:NO]; 
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 


-(void)dealloc{ 
self.currentItem = nil; 
self.currentItemValue = nil; 
self.delegate = nil; 

[_rssItems release]; 
[super dealloc]; 
} 

@end 

的代码将用于饲料,其中只有描述中使用CDATA。其他项目没有CDATA,并由应用程序显示。

非常感谢您的帮助 马蒂亚斯

+0

用实际的代码语言 – random 2012-07-28 01:51:41

回答

0

所以我找到了第一步。我在我的代码中改变了这一点:

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{ 

self.currentItem.description = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding]; 

} 

现在,我看到描述BUR与HTML标签?有人知道,我怎么能忽略HTML标签?

非常感谢 Matthias