从父元素中获取子元素的数据

6

我想要解析子级数据,即 sub_category,并显示它,但只会显示相关的父类别的 sub_category。我已经成功地解析了父元素的数据,但我在如何解析子元素方面遇到了问题。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if([elementName isEqualToString:@"category"]){
        dataCurrent = [dataFileHolder alloc];
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    currentList  = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

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

    if([elementName isEqualToString:@"name"]){
        dataCurrent.nameOfCat = currentList;
    }
    if ([elementName isEqualToString:@"description"]){
        dataCurrent.descriptionOfCat = currentList;
    }
    if ([elementName isEqualToString:@"image"]) {
        dataCurrent.imageLink = currentList;
    }
    if ([elementName isEqualToString:@"category"]) {
        [listPopulated addObject:dataCurrent];
        dataCurrent = nil;
        currentList = nil;
    }
}

XML文件如下所示:
<category>
        <name>Food</name>
        <description>food description</description>
        <image> Link Here </image>
            <sub_cat>
                <sub_name>Sub name</sub_name>
                <sub_desc>sub cat description</sub_desc>
                <sub_image> Link </sub_image>
            </sub_cat>
            <sub_cat>
                <sub_name>Sub name</sub_name>
                <sub_desc>sub cat description</sub_desc>
                <sub_image> Link </sub_image>
            </sub_cat>
</category>

我一直在研究有关事件驱动的XML解析,并从xml-parse-only-certain-child-elements线程中找到了一个很好的参考资料,但最终我仍然对XML和解析等内容感到相当困惑。我可能需要更简单易懂的术语,并且想知道如何完成我的解析部分。

2个回答

7
我希望你能使用iOS本地的XML解析器。你的XML看起来很简单易处理。尝试为每个节点创建一个字典,并将其放入数组中。因此,最终您将获得一系列字典,从中您可以轻松迭代数据。
创建NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray,同时在.h文件中有一个名为currentElementNSString
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    currentElement = elementName;
    if([elementName isEqualToString:@"category"]){
        dataDict = [[NSMutableDictionary alloc] init];
    }
    else if ([elementName isEqualToString:@"sub_cat"]) {
        if(!subCatArray) {
             subCatArray = [[NSMutableArray alloc] init];
        }
        subcatDict = [[NSMutableDictionary alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if(dataDict && !subCatArray){
        [dataDict setObject:string forKey:currentElement];
    }
    else if(subCatArray && subcatDict) {
        [subcatDict setObject:string forKey:currentElement];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqualToString:@"category"]){
        [dataDict setObject:subCatArray forKey:@"sub_cat"];
        [dataArray addObject:dataDict];
        subCatArray = nil;
        dataDict = nil;
    }
    else if([elementName isEqualToString:@"sub_cat"]){
        [subCatArray addObject:subcatDict];
        subcatDict = nil;
    }
}

这将帮助你解决问题。


我已经完成了这部分,现在只需要将父视图控制器中位于<sub_cat></sub_cat>标签内的子数据传递给我的子视图控制器。 - Ace Munim
然后创建子类别的数组,并使用subcat键将该数组保存在dataDict中。 - Sasi
1
现在您将在dataArray中拥有一个dataDict,其中可以使用sub_cat键获取子类数组。然后您可以将其传递给您的视图控制器。 - Sasi
你能再帮我一次吗?我想把我的子类别中的子名称、子描述和子图像传递给我的子视图控制器,你知道怎么做吗?因为我已经完成了这一部分的代码。非常感谢。 - Ace Munim
嘿,你得到了subCat数组对吗??它将有2个字典,就像你的示例XML一样。每个都有键值对。因此,对于第一个子类别。[subCatArray objectAtIndex:0],您将获得subCatDict。然后从subCatDict中,[subCatDict valueForKey:(sub_desc或sub_image或sub_name)]将为您提供所有值。这很方便。 - Sasi

0

尝试使用第三方的XML解析器,例如RaptureXML

然后你可以使用以下代码解析数据:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData];

查询结果根元素:

NSLog(@"Category name: %@", [rootXML child:@"name"].text);

[rootXML iterate:@"image.sub_cat" usingBlock: ^(RXMLElement *e) {
    NSLog(@"Sub name: %@", [e child:@"sub_name"].text);
}];    

请问您能否简单解释一下如何解析给定的数据?我已经完成了解析,但我想知道其他一些方法,比如使用raptureXML。另外,我正在storyboard上实现这个功能,在第一个tableView中显示父数据,然后在下一个视图中显示子数据。 - Ace Munim
您可以通过构造一个 RXMLElement 来解析数据。使用 child: 方法查询单个元素,使用 iterate:usingBlock: 查询多个元素,就像上面一样。 - eik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接