3

我将一些字典存储在 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 *)

没有将这些数据写入文件然后读取它,这是我试图避免的事情,因为它只是过度,有没有我遗漏的明显解决方法?

4

2 回答 2

7

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 在评论中指出的那样,此方法返回的字典始终是可变的。该options参数用于确定 plist 中保存的容器(数组、字典)是否也是可变的或(默认)不可变的。

如果您希望属性列表中的容器也是可变的,您可以使用NSPropertyListMutableContainers- 或NSPropertyListMutableContainersAndLeaves,如果您甚至需要叶子是可变的。

于 2013-02-22T11:38:30.223 回答
2

正如@Monolo 在他的回答中所说,NSPropertyListSerialization这是要走的路。但是,您可以在NSMutableDictionary不将数据复制到新实例的情况下获得 a。这是代码:

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);
于 2013-02-22T12:15:53.430 回答