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的主要内容,如果未能解决你的问题,请参考以下文章

如何将xml加载到plist

使用 PHP 替换 xml/plist 文件中的字符串

如何将本地保存的 xml 文件保存到 .plist 文件中

从 XML 到 PLIST 的转换

[使用PHP替换xml / plist文件中的字符串

此捆绑包无效 - Info.plist 中索引 327 处的 XML 字符“0x10”无效