ios - 从对应的父元素获取子元素的数据

标签 ios objective-c xml parsing nsxmlparser

我正在尝试解析 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>

我一直在研究 Event Driven XML Parsing并从其中一个线程中找到一个 gud 引用 xml-parse-only-certain-child-elements ,但最后我仍然对 XML 和解析的东西很困惑。我可能需要一个更简洁的术语。并且想知道如何做我的解析部分。

最佳答案

我希望你能使用 ios 原生的 xml 解析器本身。您的 XML 看起来很容易处理。只需尝试为每个节点创建字典并将其放入数组中。所以最后你会得到一组字典,你可以从中轻松地迭代你的数据。

创建NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray,还有一个NSString在.h文件中,名为currentElement .

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

这会帮助你。

关于ios - 从对应的父元素获取子元素的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18442714/

相关文章:

android - Nativescript:如何以编程方式禁用/启用 ScrollView 滚动?

objective-c - AVCaptureDevice 没有找到任何设备

java - 如何避免 JAXP 的 parse() 中的无限循环?

Common Lisp 的 XML 数据绑定(bind)

ios - XMPPFramework - 'didRecieveIQ' 何时被调用?

iphone - CoreData 版本控制和阻止轻量级迁移

ios - 如何更改导航栏中 titleView 的大小。因为在 navigationBar 的 titleView 和 backButton 之间有一个空隙

ios - 使用 UISearchController 搜索 TableView

iphone - 相对于 iPad 和 iPhone 放置图像

java - xml Java不会删除元素