如何在不改变顺序的情况下从plist加载数据

时间:2016-09-08 17:40:35

标签: ios objective-c cocoa nsdictionary ordereddictionary

我想从以下plist文件加载NSDictionary,而不更改它的顺序。 Plist file
这个plist文件是Here 我研究过很多东西,然后找到了OrderedDictionaryM13OrderedDictionary 首先,我尝试了NSDictionary(我知道它失败了)

- (void)testNSDictionary {
    NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",dictionary);
}

然后我得到了以下日志:

{
    G =     {
        R =         {
            H = "";
            S = "";
        };
        V =         {
            T = "";
        };
    };
    S =     {
        B =         {
            L = "";
        };
        O =         {
            K = "";
            L = "";
        };
        V =         {
            T = "";
        };
    };
}

这与原始plist文件完全不同! (我知道)
我认为这是按字母顺序排列的。
接下来,我使用以下代码尝试了OrderedDictionary:

#import "OrderedDictionary.h"
- (void)testOrderedDictionary {
    OrderedDictionary *dictionary = [OrderedDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",dictionary);
}

然后我得到了以下日志:

{
    G =     {
        R =         {
            H = "";
            S = "";
        };
        V =         {
            T = "";
        };
    };
    S =     {
        B =         {
            L = "";
        };
        O =         {
            K = "";
            L = "";
        };
        V =         {
            T = "";
        };
    };
}

咦?这与NSDictionary的结果相同 最后,我使用以下代码尝试了M13OrderedDictionary。

#import "M13OrderedDictionary.h"
- (void)testM13OrderedDictionary {
    M13OrderedDictionary *dictionary = [M13OrderedDictionary orderedDictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",dictionary);
}

然后我得到了以下日志:

{
}

什么都没有回来。我不明白发生了什么事 我想知道如何正确使用OrderedDictionary和M13OrderedDictionary。如果它们已经过时,我想知道将plist文件解析为NSDictionary或NSArray的替代方法。

注意:我不想更改plist文件,因为这种格式对我来说是最好的。

3 个答案:

答案 0 :(得分:1)

OrderedDictionary不能存在于plist文件中。嗯,它可以在某种意义上,但不是在你正在显示的plist文件中。 Plist文件了解NSArray,NSDictionary以及其他一些可以成为其中元素的基本类 - 这就是全部。您的plist文件由NSDictionary组成,而不是OrderedDictionary。因此,当您加载它时,您将回到普通的NSDictionary。

  

注意:我不想更改plist文件,因为这种格式对我来说是最好的

精细。但是那时你将加载一个普通的NSDictionary。

答案 1 :(得分:0)

最后,我成功使用OrderedDictionary解析了我的plist文件。这是我的代码:

[ParserDelegate.h]

@interface ParserDelegate : NSObject<NSXMLParserDelegate>
@end

[ParserDelegate.m]

#import "ParserDelegate.h"
#import "OrderedDictionary.h"
@interface ParserDelegate()
@end

@implementation ParserDelegate {
    BOOL isDict;
    BOOL isKey;
    BOOL isString;
    BOOL stringExists;
    int layer;
    int arrayNum;
    MutableOrderedDictionary *parsedDictionary;
    MutableOrderedDictionary *tempDictionary;
    MutableOrderedDictionary *tempTempDictionary;
    NSMutableArray *keysArray;
}

- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"Started parsing plist file...");
    isKey = NO;
    layer = 0;
    arrayNum = 0;
    parsedDictionary = [[MutableOrderedDictionary alloc] init];
    tempDictionary = [[MutableOrderedDictionary alloc] init];
    tempTempDictionary = [[MutableOrderedDictionary alloc] init];
    keysArray = [NSMutableArray array];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if ([elementName isEqualToString:@"dict"]) {
        isDict = YES;
        layer++;
    } else if ([elementName isEqualToString:@"key"]) {
        isKey = YES;
    } else if ([elementName isEqualToString:@"string"]) {
        isString = YES;
        stringExists = NO;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (isDict) {
        if ([tempDictionary count] != 0) {
            [tempDictionary removeAllObjects];
        }
        isDict = NO;
    }
    if (isKey) {
        [keysArray addObject:string];
        arrayNum++;
    }
    if (isString) {
        tempDictionary[[keysArray objectAtIndex:[keysArray count] - 1]] = string;
        stringExists = YES;
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"dict"]) {
        layer--;
        if (layer == 2) {
            tempTempDictionary[[keysArray objectAtIndex:[keysArray count] - [tempDictionary count] - 1]] = [tempDictionary copy];
        } else if (layer == 1) {
            parsedDictionary[[keysArray objectAtIndex:[keysArray count] - arrayNum]] = [tempTempDictionary copy];
            [tempTempDictionary removeAllObjects];
            arrayNum = 0;
        }
    } else if ([elementName isEqualToString:@"key"]) {
        isKey = NO;
    } else if ([elementName isEqualToString:@"string"]) {
        if (!stringExists) {
            tempDictionary[[keysArray objectAtIndex:[keysArray count] - 1]] = @"";
        }
        isString = NO;
    }
}

-(void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"Finished parsing!");
    NSLog(@"%@",[parsedDictionary description]);
}

@end

很抱歉这个脚本只支持我的plist文件,因此无法解析其他格式的plist文件。

用法:

ParserDelegate *parserDelegate = [[ParserDelegate alloc] init];
NSURL *url = [NSURL fileURLWithPath:filePath];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
parser.delegate = parserDelegate;
[parser parse];

答案 2 :(得分:0)

我发现上面的脚本有一些错误 我联系了OrderedDictionary的开发人员,最后他完成了导入和导出功能 OrderedDictionary v1.4可以从plist文件中导入OrderedDictionary数据(仅限xml格式)。

我真的很感激。