解析TableView的XML元素

时间:2014-09-03 10:19:37

标签: objective-c nsxmlparser

目前,我正在设计一款能够阅读新闻Feed的简单应用。我正在使用的XML Feed是http://feeds.foxnews.com/foxnews/world?format=xml

我要做的主要是从这个页面获取'title'元素和描述元素,并在TableView中使用它们。

这就是我目前所拥有的:

-(void)parserDidStartDocument:(NSXMLParser *)parser{
    _elementsArray = [[NSMutableArray alloc]init];
}

-(void)parser:(NSXMLParser*)parser foundCharacters:(NSString *)string{
    if (!_currentString) {
        _currentString = [[NSMutableString alloc]init];
    }
    [_currentString appendString:string];
}

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

    if ([elementName isEqualToString:@"title"]) {
        [_elementsArray addObject:_currentString];
        _currentString=nil;
        return;

    }
    if ([elementName isEqualToString:@"description"]) {
        [_elementsArray addObject:_currentString];
        _currentString=nil;
        return;
    }
    _currentString = nil;
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
    for (NSString*string in _elementsArray) {
        NSLog(@"%@",string);
    }
    _elementsArray = nil;
}

我确实得到了这个输出,这不是问题。

我的问题是每个元素都添加到新的NSArray条目中。如何将两个元素添加到一个条目? (可以使用密钥吗?)

1 个答案:

答案 0 :(得分:0)

您可以使用临时NSDictionary将每个项目的标题和说明存储在一起,并将字典添加到_elementsArray

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    if ([elementName isEqualToString:@"item"]) {
        _currentDict = [NSMutableDictionary dictionary];
        return;
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString      *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:@"item"]) {
        [_elementsArray addObject:_currentDict];
        _currentDict=nil;
        return;
    }
    if ([elementName isEqualToString:@"title"]) {
        _currentDict[@"title"] = _currentString;
        _currentString=nil;
        return;

    }
    if ([elementName isEqualToString:@"description"]) {
        _currentDict[@"description"] = _currentString;
        _currentString=nil;
        return;
    }
    _currentString = nil;
}

// Other methods left unchanged

这应输出如下内容:

NSArray (
    NSDictionary {
        @"title": @"First title",
        @"description": @"A news article"
    },
    NSDictionary {
        @"title": @"Second title",
        @"description": @"Another interesting article"
    }
)

未经测试,但我希望你明白这一点。

另请注意,将XML(或RSS)文件解析为本机ObjC对象是一个非常反复出现的问题,许多开源库已经为您完成了大部分繁重工作。