如何在不改变顺序的情况下从plist加载数据
How to load data from plist without changing the order
我想从下面的 plist 文件加载 NSDictionary,而不改变它的顺序。
这个 plist 文件是 Here.
我研究了很多东西,我发现 OrderedDictionary and M13OrderedDictionary.
首先,我尝试了 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文件,因为这种格式最适合我。
OrderedDictionary 不能存在于 plist 文件中。好吧,它可以在某种意义上,但不是在您显示的 plist 文件中。 Plist 文件知道 NSArray、NSDictionary 和其他一些基本的 类 可以作为它们的元素——仅此而已。您的 plist 文件包含一个 NSDictionary,而不是一个 OrderedDictionary。所以当你加载它时,你只会取回一个普通的 NSDictionary。
Note: I don't want to change plist file, because this format is the best for me
很好。但是你将要加载一个普通的 NSDictionary。
最后我成功地使用 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];
我发现上面的脚本有一些错误。
我联系了OrderedDictionary的开发者,最后他做了导入导出功能。
OrderedDictionary v1.4 可以从 plist 文件导入 OrderedDictionary 数据(仅限 xml 格式)。
非常感谢。
我想从下面的 plist 文件加载 NSDictionary,而不改变它的顺序。
这个 plist 文件是 Here.
我研究了很多东西,我发现 OrderedDictionary and M13OrderedDictionary.
首先,我尝试了 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文件,因为这种格式最适合我。
OrderedDictionary 不能存在于 plist 文件中。好吧,它可以在某种意义上,但不是在您显示的 plist 文件中。 Plist 文件知道 NSArray、NSDictionary 和其他一些基本的 类 可以作为它们的元素——仅此而已。您的 plist 文件包含一个 NSDictionary,而不是一个 OrderedDictionary。所以当你加载它时,你只会取回一个普通的 NSDictionary。
Note: I don't want to change plist file, because this format is the best for me
很好。但是你将要加载一个普通的 NSDictionary。
最后我成功地使用 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];
我发现上面的脚本有一些错误。
我联系了OrderedDictionary的开发者,最后他做了导入导出功能。
OrderedDictionary v1.4 可以从 plist 文件导入 OrderedDictionary 数据(仅限 xml 格式)。
非常感谢。