我在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 *)
没有将这些数据写入文件然后阅读它,我试图避免的东西,因为它只是过量,我有什么明显的解决方法吗?
答案 0 :(得分: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
,如果您甚至需要叶子是可变的。
答案 1 :(得分: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);