高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1208
CFXML to CFPropertyListRef (and back!)


Q: CFPropertyListRef を XML ファイルに保存したり、XML ファイルから CFPropertyListRef を復元したりする簡単な方法はありますか?

A: 詳細はすべて、<http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPropertyLists/Tasks/Saving.html> に記述されています。

単にコードだけを知りたい場合は、下記を参照してください。

 

/**\
|**|    ここでは、プロパティリストを XML ファイルに保存
\**/
 
SInt32 SaveToXMLFile(
    CFPropertyListRef pCFPRef,
    CFStringRef pFilePathCFStrRef)
{
    CFDataRef xmlCFDataRef;
    CFURLRef myCFURLRef;
    Boolean status;
    SInt32 errorCode = noErr;
 
// プロパティリストを XML データに変換
    xmlCFDataRef = CFPropertyListCreateXMLData(
        kCFAllocatorDefault, pCFPRef);
 
// これから作成する XML データの保存先のファイルを
// 指定する URL を作成
    myCFURLRef = CFURLCreateWithFileSystemPath(
            kCFAllocatorDefault,
pFilePathCFStrRef,    // ファイルパス名
kCFURLHFSPathStyle,
false );              // ディレクトリか?
 
// XML データをファイルに書き込む
    status = CFURLWriteDataAndPropertiesToResource (
myCFURLRef,          // 使用する URL
xmlCFDataRef,        // 書き込むデータ
            NULL,
            &errorCode);
 
// 解放する責任のあるすべての CF オブジェクトを解放
    CFRelease(xmlCFDataRef);
    CFRelease(myCFURLRef);
 
    return errorCode;    
}
 
/**\
|**|    ここでは、XML ファイルをプロパティリストへロード
\**/
 
CFPropertyListRef LoadFromXMLFile(
    CFPropertyListRef pCFPRef,
    CFStringRef pFilePathCFStrRef)
{
    CFURLRef myCFURLRef;
    CFDataRef xmlCFDataRef;
    CFPropertyListRef myCFPropertyListRef = NULL;
    SInt32 errorCode = noErr;
    Boolean status;
 
// XML データをロードする元のファイルを
// 指定する URL を作成
    myCFURLRef = CFURLCreateWithFileSystemPath(
            kCFAllocatorDefault,
pFilePathCFStrRef,    // ファイルパス名
            kCFURLHFSPathStyle,
false );              // ディレクトリか?
 
// XML ファイルを読み取る
    status = CFURLCreateDataAndPropertiesFromResource(
            kCFAllocatorDefault,
            myCFURLRef,
&xmlCFDataRef,        // ファイルデータを置く場所
            NULL,
            NULL,
            &errorCode);
 
    if (!status)
    {
        CFStringRef    errorString;
// XML データを使ってディクショナリを再構成
        myCFPropertyListRef = CFPropertyListCreateFromXMLData(
                kCFAllocatorDefault,
                xmlCFDataRef,
                kCFPropertyListImmutable,
                &errorString);
    }
 
// 解放する責任のあるすべての CF オブジェクトを解放
    CFRelease(myCFURLRef);
    CFRelease(xmlCFDataRef);
 
    return myCFPropertyListRef;
}
 

リスト 1. CFXML <-> CFPropertyList


[2003 年 8 月 20 日]