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

NSPropertyListSerializationNSDataインスタンスから読み取る、それを行う便利なメソッドがあります。

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データを新しいインスタンスにコピーしなくても取得できます。コードは次のとおりです。

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 に答える