【问题标题】:Getting data of Child Element from its Parent counterpart从父元素获取子元素的数据
【发布时间】:2013-08-28 20:37:29
【问题描述】:

我试图解析子类别的子数据并显示它,但只会显示父类别的相关子类别。我成功解析了父元素的数据,但我在如何解析子元素时遇到了问题。

- (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 并且还从其中一个线程xml-parse-only-certain-child-elements 中找到了一个 gud 参考,但最后我仍然对 XML 和解析内容感到困惑。我可能需要一个更浅的术语。并且想知道如何做我的解析部分。

【问题讨论】:

    标签: ios objective-c xml parsing nsxmlparser


    【解决方案1】:

    尝试使用第三方 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,顺便说一句,我正在实现这个在情节提要上,我在第一个 tablevView 上显示父数据,然后在下一个视图中显示子数据。
    • 你可以通过构造一个RXMLElement来解析你的数据。使用child: 方法查询结果对象中的单个元素,使用iterate:usingBlock: 方法查询多个元素,如上。
    【解决方案2】:

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

    创建NSMutableArray *dataArray &amp; NSMutableDictionary *dataDict &amp; NSMutableDictionary *subcatDict NSMutableArray *subCatArray,在.h文件中也有一个NSString,命名为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;
        }
    }
    

    这会对你有所帮助。

    【讨论】:

    • 在这部分之前我已经这样做了,我现在只是缺少将 标记内的子数据从我的父视图控制器传递到我的子视图控制器。
    • 然后创建 subcat 数组并使用 subcat 键将该数组保存在 dataDict 中。
    • 查看更新后的答案。现在您将在 dataArray 中拥有一个 dataDict。您可以使用 sub_cat 键从中获取 sub_cat 数组。然后你可以将它传递给你的视图控制器。
    • 你能帮我最后一个吗,我想将我的 sub_cat 中的值(即 sub_name、sub_desc 和 sub_image)传递给我的 childView 控制器,我想知道这怎么可能,因为我到目前为止,我已经完成了我的代码。并感谢一堆。
    • 嘿,你得到了 subCat 数组吗?在您的示例 XML 中将有 2 个字典。每个都有键值对。所以对于第一个 sub_cat。 [subCatArray objectAtIndex:0] 你会得到 subCatDict。然后从 subCatDict, [subCatDict valueForKey:(sub_desc or sub_image or sub_name)] 将为您提供所有值。那它就派上用场了。
    猜你喜欢
    • 1970-01-01
    • 2016-05-11
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多