2012-01-18 66 views
0

我目前有一個問題,從一個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

回答

0

您的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