plist XML 字符串到 NSMutableDictionary
Posted
技术标签:
【中文标题】plist XML 字符串到 NSMutableDictionary【英文标题】:plist XML string to NSMutableDictionary 【发布时间】:2013-02-22 11:17:54 【问题描述】:我将一些字典存储在 plist 文件 (ios) 中,这些文件随后会被加密。 读取文件内容并解密后,我以字符串形式返回文件的 xml 内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>password</key>
<string>apassword</string>
<key>username</key>
<string>ausername</string>
</dict>
</plist>
我知道方法:dictionaryWithContentsOfFile:(NSString *)
和 dictionaryWithContentsOfFile:(NSURL *)
从此类数据创建字典,但很惊讶没有这样的 dictionaryWithXML:(NSString *)
没有将此数据写入文件然后读取它,这是我试图避免的,因为它只是过度,是否有任何明显的解决方法我遗漏了?
【问题讨论】:
Parse Plist (NSString) into NSDictionary 的可能重复项 【参考方案1】:NSPropertyListSerialization
有一个方便的方法可以帮您完成,从NSData
实例中读取:
NSString *source = ... // The XML string
NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSMutableDictionary* plist = [NSPropertyListSerialization propertyListWithData:plistData
options: NSPropertyListImmutable
format:NULL
error:&error];
正如@Adam 在 cmets 中指出的那样,此方法返回的字典始终是可变的。 options
参数用于确定 plist 中保存的容器(数组、字典)是否也是可变的或(默认)不可变的。
如果你希望属性列表中的容器也是可变的,你可以使用NSPropertyListMutableContainers
- 或NSPropertyListMutableContainersAndLeaves
,如果你甚至需要叶子是可变的。
【讨论】:
propertyListWithData:options:format:error:
方法将始终返回一个 NSMutableDictionary
实例。 options
参数会影响其内容。
@Adam 我刚刚用NSPropertyListImmutable
对其进行了测试,得到了__NSCFDictionary
,我认为它是不可变的,所以也许我们不是在谈论同一件事?
@Monolo __NSCFDictionary
是类集群的私有类。 NSMutableDictionary
可以是 __NSCFDictionary
或 __NSDictionaryM
或 Apple 决定在后台使用的任何其他类的实例。 AFAIK,__NSCFDictionary
可以是可变的或不可变的。要检查可变性,我会这样做:[dict isKindOfClass:[NSMutableDictionary class]]
.【参考方案2】:
正如@Monolo 在他的回答中所说,NSPropertyListSerialization
是要走的路。但是,您可以在不将数据复制到新实例的情况下获得 NSMutableDictionary
。代码如下:
NSString *str = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd\"><plist version=\"1.0\"><dict><key>password</key><string>apassword</string><key>username</key><string>ausername</string></dict></plist>";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSPropertyListFormat format;
NSMutableDictionary *dict = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:&format error:&err];
if (err)
NSLog(@"err: %@", err);
NSLog(@"original dictionary: %@", dict);
[dict setValue:@"newPass" forKey:@"password"];
NSLog(@"modified dictionary: %@", dict);
【讨论】:
以上是关于plist XML 字符串到 NSMutableDictionary的主要内容,如果未能解决你的问题,请参考以下文章