2013-02-22 76 views
3

我在plist文件(iOS)中存储一些字典,随后加密。 读取文件内容和解密他们之后,我返回文件的XML内容的字符串:plist XML字符串到NSMutableDictionary

<?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

[解析的plist(NSString的)转换成的NSDictionary](http://stackoverflow.com/questions/1072308/parse-plist-nsstring-into-nsdictionary) – ismail 2013-02-28 16:32:04

回答

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

的'propertyListWithData的可能重复:options:format:error:'方法总是返回一个'NSMutableDictionary'实例。 'options'参数影响其内容。 – Adam 2013-02-22 12:25:58

+0

非常好,谢谢。 – amcc 2013-02-22 12:26:39

+0

@Adam我刚刚用'NSPropertyListImmutable'测试了一下'__NSCFDictionary',我认为它是不可变的,所以也许我们不是在谈论同一件事情? – Monolo 2013-02-22 13:12:05

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);