MFC
XML をファイルのように扱う(1.準備)


HomeProgramming TipsMFC Tips[MFC-016]

階層化されたデータを保存する場合、Ini 形式では不便なことが多いです。
特にデータの数が可変の場合は Ini ではどうしても記述に無理が出ます。

そこで最近流行(!?)の xml を使います。
ただ、xml の操作全てを解説するのは困難です。
本ページでは、ファイルのように読み書きすることを目的として解説します。
ややボリュームが大きいので3回に分けて解説します。
※ 自分なりの解釈ですので用語の使い方などに間違いがあるかもしれません。

■ 必要なファイル

xml の操作には XML パーサー(XML構文解析ツール)を使うのが一般的です。
Windows であれば無料で手に入る MSXML 4.0 が良いでしょう。
MSXML 4.0 Service Pack 2 (Microsoft XML Core Services)

また、下記のパッチも適用してください。
Hotfix for MSXML 4.0 Service Pack 2 - KB832414 - 日本語

※ 上記リンクの場所が変わったときはググると見つかると思います。

■ 準備

MSXML4 を使用するためには、最初に COM の初期化を行います。
これは InitInstance に記述すればよいでしょう。
また、COM の後片付けは ExitInstance で行います。
ダイアログベースの場合は、InitInstance 内の dlg.DoModal(); を挟む形で記述します。

BOOL CFooApp::InitInstance()
{
    InitCommonControls();
    CWinApp::InitInstance();

    // COMの初期化
    ::CoInitialize(NULL);

    // 〜省略〜
    return TRUE;
}

BOOL CFooApp::ExitInstance()
{
    // COMの終了
    ::CoUninitialize();

    return CWinApp::ExitInstance();
}

MSXML4 パーサーを使用するために dll をインポートします。
これは実際に MSXML4 を使用するファイルの先頭にでも以下の記述をします。


#import "msxml4.dll" named_guids


これで名前空間「MSXML2」内で各種メソッドを使用できるようになります。
私はいちいちスコープ解決演算子を記述する方です。
面倒な人は、using namespace を使ったり、各スマートポインタの名前をスコープ付きで定義したりすると良いでしょう。

■ 使用するスマートポインタ

MSXML2::IXMLDOMDocumentPtr
ドキュメントを管理するポインタ。このポインタに全データが格納されています。

MSXML2::IXMLDOMNodeListPtr
ノードリストポインタ。データは更に下位ノードとして複数ぶら下がります。
あくまでもリストなので、Getitem(連番)でデータを指定します。

MSXML2::IXMLDOMElementPtr
エレメントポインタ。リストから取り出したデータ(一つのノード)を管理します。
上記リストから Getitem() で取得したポインタがエレメントとなります。

■ エラーの捕捉

MSXML4 はエラーが発生した場合、例外を投げてくれます。
try{}catch() を使って例外を捕捉することで、どんなエラーが発生したかを確認できます。


    try {

        // 〜 XML 処理 〜

    } catch (_com_error& e) {

        CString strErr;
        strErr.Format(
            _T("Error: %08X\n説明: %s\n"),
            e.Error(), e.ErrorMessage()
        );
        MessageBox(strErr, "error", MB_ICONERROR);
    }


以上で準備は出来たことかと思います。
次はいよいよデータの保存を解説します。

 >> 2. 保存に進む 


 Copyright 2005 VALGUS. All Rights Reserved.