解析XML项目“类别”使用NSDictionary进入NSArray [英] Parse XML item "Category" into an NSArray with NSDictionary

查看:64
本文介绍了解析XML项目“类别”使用NSDictionary进入NSArray的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从.XSD模板生成的XML文件生成下面粘贴的输出。由于 类别 的密钥是 图片 ,我的标准解析图像项目的方法不适用于类别。我想将 类别name =Category# 放入数组中,如何从类别字段中创建数组。

The generated XML file from an .XSD template produces the output pasted below. Since category's keys are image, my standard way of parsing the image items wont work on category. I would like to place the category name="Category #" into an array, How can I make an array from the category fields.

我想要的是一系列字典。每个位置包含一个代表一个类别的字典,每个字典包含该类别的图像。

What I want is an array of dictionaries. Each position contains a dictionary representing one category, and each dictionary contains images for that category.


数组:@类别1,@类别2,@类别3;

对于每个数组,一个字典with:< image> 以及介于两者之间的所有内容 < / image>

基本上,我需要创建一个类似下图的plist,来自XML数据源

Basically, I need to create a plist like the following image, from the XML data source

<?xml version="1.0" encoding="UTF-8"?>
<app xmlns="http://www.wrightscs.com/_xml_.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wrightscs.com/_xml_.xsd" name="Testing" unlock_product_id="com.wrightscs.all">
    <bannerImg>http://www.wrightscs.com</bannerImg> 
    <category name="Category 1" icon="http://www.wrightscs.com">
        <image>
                <title>title</title>
                <thumbUrl>http://www.wrightscs.com</thumbUrl>
                <sampleUrl>http://www.wrightscs.com</sampleUrl>
                <imageUrl>http://www.wrightscs.com</imageUrl>
                <description>These items / keys not an issue.</description>
                <infoUrl>http://www.wrightscs.com</infoUrl>
                <license>http://www.wrightscs.com</license>
                <licenseUrl>http://www.wrightscs.com</licenseUrl>
        </image>
    </category>
    <category name="Category 2" icon="http://www.wrightscs.com">
        <image>
                <title>title</title>
                <thumbUrl>http://www.wrightscs.com</thumbUrl>
                <sampleUrl>http://www.wrightscs.com</sampleUrl>
                <imageUrl>http://www.wrightscs.com</imageUrl>
                <description>These items / keys not an issue.</description>
                <infoUrl>http://www.wrightscs.com</infoUrl>
                <license>http://www.wrightscs.com</license>
                <licenseUrl>http://www.wrightscs.com</licenseUrl>
        </image>
    </category> 
    <category name="Category 3" icon="http://www.wrightscs.com">
        <image>
                <title>title</title>
                <thumbUrl>http://www.wrightscs.com</thumbUrl>
                <sampleUrl>http://www.wrightscs.com</sampleUrl>
                <imageUrl>http://www.wrightscs.com</imageUrl>
                <description>These items / keys not an issue.</description>
                <infoUrl>http://www.wrightscs.com</infoUrl>
                <license>http://www.wrightscs.com</license>
                <licenseUrl>http://www.wrightscs.com</licenseUrl>
        </image>
    </category>
</app>

注意:没有其他项目/密钥是一个问题,我只对将类别转换为数组。此示例中的URL也会从原始内容中替换。

推荐答案

解决方案:



The Solution:

#pragma mark -
#pragma mark Delegate Received

-(void)parsingComplete:(XMLDataSource*)theParser {
    NSArray *categoryArray = [theParser getCategories];
    [categoryArray writeToFile:PLIST atomically:YES];
}
- (void)receivedItems:(NSArray *)theItems {
    NSMutableArray *dataItems = [[NSMutableArray alloc] init];
    [dataItems addObjectsFromArray:[NSArray arrayWithContentsOfFile:PLIST]];

    NSDictionary * dataItem = [dataItems objectAtIndex:categoryIndex];
    data_ =  [dataItem objectForKey:@"images"];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateThumbs" object:nil];
}


#pragma mark -
#pragma mark Parsing Delegates

- (void)parse:(NSData *)data withDelegate:(id)sender onComplete:(SEL)callback 
{
    parentDelegate = sender;
    onCompleteCallback = callback;
    loading = YES;

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    parsed = NO;
    loading = NO;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{
    NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    currentElement = element;
    if ([[currentElement lowercaseString] isEqual:@"image"]) {
        inImage = YES;
        itemsDictionary = [[NSMutableDictionary alloc] init];
        [itemsDictionary addEntriesFromDictionary:attributeDict];
    }

    if ([[currentElement lowercaseString] isEqual:@"category"]) {
        inCategory = YES;
        categoryDictionary = [[NSMutableDictionary alloc] init];
        [categoryDictionary addEntriesFromDictionary:attributeDict];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName 
{
    NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ([[element lowercaseString] isEqual:@"image"]) {
        inImage = NO;
        [items addObject:[itemsDictionary copy]];
    }

    if ([[element lowercaseString] isEqual:@"category"]) {
        inCategory = NO;
        [categoryDictionary setObject:[items copy] forKey:@"images"];
        [items removeAllObjects];
        [categories addObject:[categoryDictionary copy]];
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{
    NSString *stringValue = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *element = [currentElement stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    /*  skip over blank elements.  */
    if (stringValue == nil || [stringValue isEqual:@""]) {
        return;
    }

    if (element != nil && [element length] > 0) {
        if (inImage) {
            if ([itemsDictionary objectForKey:element] != nil) {
                [itemsDictionary setObject:[NSString stringWithFormat:@"%@%@", [itemsDictionary objectForKey:element], stringValue]
                                    forKey:element];
            } else {
                [itemsDictionary setObject:stringValue forKey:element];
            }
        } else if ((!inImage) && (inCategory)) {
            if ([categoryDictionary objectForKey:element] != nil) {
                [categoryDictionary setObject:[NSString stringWithFormat:@"%@%@", [categoryDictionary objectForKey:element], stringValue]
                                       forKey:element];
            } else {
                [categoryDictionary setObject:stringValue forKey:element];
            }
        } else {
            if ([root objectForKey:element] != nil) {
                [root setObject:stringValue forKey:element];
            }
        }
    }
}
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSError * err;
    if(![[NSFileManager defaultManager] fileExistsAtPath:PLIST]) {
        [[NSFileManager defaultManager] removeItemAtPath:PLIST error:&err];
    }
}
- (void)parserDidEndDocument:(NSXMLParser *)parser 
{
    parsed = YES;
    loading = NO;

    if ([parentDelegate respondsToSelector:onCompleteCallback]) {
        [parentDelegate performSelector:onCompleteCallback withObject:self];
    }

    if ([self respondsToSelector:@selector(receivedItems:)])
        [self receivedItems:items];
    else
        SHOW_ALERT(@"parserDidEndDocument:", @"receivedItems: not responding!", nil, @"Okay", nil)
}


#pragma mark -
#pragma mark Setters / Getters

- (id)delegate {
    return self;
}
- (void)setDelegate:(id)new_delegate {
    _delegate = self;
}
- (BOOL)isSuccessful {
    return success;
}
- (BOOL)isLoading {
    return loading;
}
- (BOOL)isParsed {
    return parsed;
}
- (NSArray *)getCategories {
    return categories;
}
- (NSDictionary *)getRoot {
    return root;
}
- (void)dealloc {
    [super dealloc];
}

这篇关于解析XML项目“类别”使用NSDictionary进入NSArray的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆