【发布时间】:2016-09-08 17:40:34
【问题描述】:
我想从下面的 plist 文件中加载 NSDictionary,而不改变它的顺序。
这个 plist 文件是 Here.
我研究了很多东西,发现了OrderedDictionary和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 文件,因为这种格式最适合我。
【问题讨论】:
-
您如何确定密钥有问题?您决定访问 NSDictionary 中的键的顺序。如果您希望使用具有确定顺序的集合,请使用 NSArray,而不是 NSDictionary。
-
我知道 NSArray 可以保存订单,但它不能拥有 NSArray 本身的名称。例如在这种情况下,最深层的 T,S,H,T,L,K,L 可以被 NSArray 包含,但其他人不能。是否可以在 NSArray plist 中包含数组名称本身?
-
你知道
NSXMLDocument吗?它可用于在一行中加载任何格式正确的 xml 文档(包括 plist),其 API 与NSDictionary和NSArray(init(URL:...) 的 API 非常相似。一旦你在内存中得到了这个文档,你就可以遍历它的元素来构建你的有序字典。或者您可以将其保留为NSXMLDocument实例,并利用 xPath 的强大功能对其进行解析。 -
谢谢!我不知道 NSXMLDocument!尝试一下似乎很有意义。
-
NSXMLDocument不适用于 iOS。
标签: ios objective-c cocoa nsdictionary ordereddictionary