2013-02-22 67 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);