Iphone编程XML解析器NSMutableArray

问题描述:

我目前有一个问题,从一个XML解析信息到一个NSMutableArray,我已经粘贴了下面的代码解析器,这从互联网上检索文档,并构建数组。然后,我试图将xml解析器中的项目复制到NSMutableArray进行搜索,但是每次我尝试复制数组时,它都会返回一个结构错误,因此我现在已经删除了这些更改。Iphone编程XML解析器NSMutableArray

这是在主视图控制器中的解析器和viewdidload的当前代码的代码,如果任何人都可以帮助我,我真的很感激它。

#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://xxxxxxxxx.co.uk/rssparser/Data.xml"]; 
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:@"description"] || 
      [elementName isEqualToString:@"mediaUrl"] || 
      [elementName isEqualToString:@"link"] || 
      [elementName isEqualToString:@"guid"] || 
      [elementName isEqualToString:@"pubDate"]) { 
    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:@"description"]){ 
    self.currentItem.description = self.currentItemValue; 
}else if([elementName isEqualToString:@"link"]){ 
    self.currentItem.linkUrl = self.currentItemValue; 
}else if([elementName isEqualToString:@"mediaUrl"]){ 
    self.currentItem.mediaUrl = self.currentItemValue; 
}else if([elementName isEqualToString:@"guid"]){ 
    self.currentItem.guidUrl = 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:@"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{ 
//Not needed for now 
} 

- (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 

BlogRSSParser.h

#import <Foundation/Foundation.h> 

@class BlogRss; 
@protocol BlogRssParserDelegate; 
@interface BlogRssParser : NSObject <NSXMLParserDelegate>{ 
BlogRss * _currentItem; 
NSMutableString * _currentItemValue; 
NSMutableArray * _rssItems; 
id<BlogRssParserDelegate> _delegate; 
NSOperationQueue *_retrieverQueue; 
} 


@property(nonatomic, retain) BlogRss * currentItem; 
@property(nonatomic, retain) NSMutableString * currentItemValue; 
@property(readonly) NSMutableArray * rssItems; 

@property(nonatomic, assign) id<BlogRssParserDelegate> delegate; 
@property(nonatomic, retain) NSOperationQueue *retrieverQueue; 

- (void)startProcess; 


@end 

@protocol BlogRssParserDelegate <NSObject> 

-(void)processCompleted; 
-(void)processHasErrors; 

@end 

viewDidLoad中

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
[super viewDidLoad]; 
[self toolbarInit]; 
_rssParser = [[BlogRssParser alloc]init]; 
self.rssParser.delegate = self; 
[[self rssParser]startProcess]; 
} 
+0

你所说的“结构错误” – Rayfleck 2012-01-18 18:07:58

+0

预期结构NSArray中的意思是*通过initwitharray的参数1时,这是当我试图来填充NSMutableArray与_rssParser – Bradrob 2012-01-18 18:17:03

+0

的内容,你可以发布你的代码在你的.h文件太 – madmik3 2012-01-18 18:51:56

您的RSSItems阵列被标记为 “只读”。

变化:

@property(readonly) NSMutableArray * rssItems; 

@property(nonatomic, retain) NSMutableArray * rssItems; 
+0

谢谢你会试试看,brad – Bradrob 2012-01-18 19:03:28

+0

我刚刚试图在视图控制器尝试使用_rssparser数组中的项目使用\t displayitems = [[NSMutableArray alloc] initWithArray:_rssParser];但它返回上面提到的相同的警告,然后退出应用程序。你认为我应该在bloggrssparser.m或视图控制器中填充数组,因为这是解析器运行的地方,但我不知道如何从解析器获取项目并将它们放入一个可变数组中。 – Bradrob 2012-01-18 19:14:30

+0

我没有在您发布的代码中看到这些声明。但它看起来像你试图初始化一个可变数组,但你传递给它一个rssParser对象。 _rssParser是NSArray的一个实例吗?我怀疑不是。你是否可以发布该代码> – Rayfleck 2012-01-18 19:19:48