2012-04-16 13 views
0

アプリケーションデータ(これは10.7のMacアプリケーション)をXMLファイルとして書き出すことを許可しており、1つのフィールドからエクスポート/インポートできるようにしたいXMLはNSDataフィールドです。これを行う正しい/受け入れられる方法は何でしょうか?私はconvert to base64とXMLにその文字列を書く必要がありますか?NSXMLElementに任意のNSDataを書き込む最良の方法

カテゴリを使用して、リンクされた質問に受け入れられた回答(Matt Gallagher's solutionへのリンク)として私自身の解決策をロールしたくないです。

更新

私はちょうどNSPropertyListSerializationクラスを発見しました。私は希望を持っていますが、それはただNSData表現を返す静的な直列化メソッドしか持っていません。

+1

(NSDataのを)これは私がシリアル化するために使用しているものです。可能であれば、私は生データを持つ別のファイルを書き、そのURLをXMLフィールドに追加します。これはオプションでない場合、私は '>'、 '<'のような文字を避けるように注意して文字列に変換します。 – Mircea

+0

@Mircea XMLのフォーマットは意味が分かります。インスタンス。バイナリフィールドは、表現されたエンティティの多くのフィールドのうちの1つだけであり、ファイル内には何百ものエンティティが存在することがあります。私は、シンプルさとユーザー編集可能な性質を1つのファイルのほんの一種を作ることよりも好む。 – Dov

+0

XMLは特定の形式である必要がありますか、または標準のMac OS Xプロパティリスト形式で行いますか?それは純粋なXMLです。 –

答えて

0

によって返されたNSDataがちょうどUTF-8文字列であるため、私はNSPropertyListSerializationクラスを使用できるとわかりました。

NSData *data = value; 

NSError *error = nil; 
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:data 
                   format:NSPropertyListXMLFormat_v1_0 
                   options:0 
                   error:&error]; 
if (error) { 
    NSLog(@"Error serializing data to plist XML: %@", error); 
} else { 
    NSString *plistString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding]; 
    NSXMLElement *dataElement = [NSXMLElement elementWithName:field 
                stringValue:plistString]; 
} 

そしてデシリアライズ::私はXMLに生データを追加しないでしょう

NSData *plistData = [element.stringValue dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *originalData = [NSPropertyListSerialization propertyListWithData:plistData 
                   options:NSPropertyListImmutable 
                    format:NULL 
                    error:&error]; 

if (error) { 
    NSLog(@"Error deserializing data from plist XML: %@", error); 
} else { 
    value = originalData; 
} 
関連する問題