2014-07-09 66 views
0

我试图将一个XML源导入到我的iOS应用程序中,以便用户可以阅读最近的帖子。但每次点击单元格时我都会收到此错误。将XML解析到iOS中

终止应用程序由于未捕获的异常“NSInvalidArgumentException”,理由是:“试图改变一个不可改变的对象与appendString:”

的代码如下,如果有人能帮助我走出那会是真棒!

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.feeds = [[NSMutableArray alloc] init]; 
    NSURL *url = [NSURL URLWithString:@"http://www.autoblog.com/rss.xml"]; 
    self.parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

    [self.parser setDelegate:self]; 
    [self.parser setShouldResolveExternalEntities:NO]; 
    [self.parser parse]; 

} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"posts" forIndexPath:indexPath]; 

    // Configure the cell... 
    cell.textLabel.text = [[self.feeds objectAtIndex:indexPath.row] objectForKey: @"title"]; 

    return cell; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

    self.element = elementName; 

    if ([self.element isEqualToString:@"item"]) { 

     self.item = [[NSMutableDictionary alloc] init]; 
     self.title = [[NSMutableString alloc] init]; 
     self.link = [[NSMutableString alloc] init]; 

    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if ([self.element isEqualToString:@"title"]) { 
     [self.title appendString:string]; 
    } else if ([self.element isEqualToString:@"link"]) { 
     [self.link appendString:string]; 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"item"]) { 

     [self.item setObject:self.title forKey:@"title"]; 
     [self.item setObject:self.link forKey:@"link"]; 

     [self.feeds addObject:[self.item copy]]; 

    } 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 

    [self.tableView reloadData]; 

} 

只要你知道错误在这一点上的代码高亮显示:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if ([self.element isEqualToString:@"title"]) { 
     [self.title appendString:string]; 
    } else if ([self.element isEqualToString:@"link"]) { 
     [self.link appendString:string]; 
    } 

} 
+0

'self.title'是'NSString'。你不能在'NSString'上调用'appendString:'。 – rmaddy

+0

顺便说一句 - 你的'title'属性是否带有'copy'属性? – rmaddy

+0

我应该怎样改变它? – dereksaunders

回答

0

我在评论区希望我们几乎解决您的问题。

从我看到标题你遇到CDDATA块的XML数据。这是一种特殊类型的数据,您必须对其进行处理。你可以试试这个到GRUB中的数据....

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock 
{ 
    self.title = [[NSMutableString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding]; 
} 

您可以点击以下链接了解更多关于筹钱CDDATA NSXMLParser doesn't ignore CDATA

+0

非常感谢你的帮助!我们正在越来越近它现在显示项目,但它显示博客文章的作者和Im试图显示标题。 – dereksaunders