MFC
MSXML の出力をインデントする


HomeProgramming TipsMFC Tips[MFC-027]

XML をファイルのように扱う(2.保存)で、MSXML 文書を保存すると、
全てが繋がった1行としてズラズラと出力されます。

スペース効率という観点からはとってもエコロジー(爆)なのですが、
可読性という観点からはとても褒められたモノではありません。

当初、行単位で改行コードを出力しなくてはいけないかと思っていましたが、
書式化出力インターフェースという便利なモノを発見しました。
これを使うとあら不思議、出力された XML 構文がインデント付きで綺麗に整形されています。

最後に XML ドキュメントの save() メソッドで保存するのではなく下記の処理を加えてみてください。


BOOL SaveIndentXML(
    CString strPath,                // 出力するフルパスファイル名
    MSXML2::IXMLDOMDocumentPtr pDoc // 出力する MSXML ドキュメント
)

{
    try {

        // 書式化出力インターフェースにてインデント処理してXML文書を保存する
        IStreamPtr stmFile;
        SHCreateStreamOnFile(
            strPath,
            STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_CREATE,
            &stmFile
        );

        MSXML2::IMXWriterPtr wrt;
        wrt.CreateInstance("MSXML2.MXXMLWriter");
        wrt->put_version(L"1.0");
        wrt->put_encoding(L"Shift_JIS");
        wrt->put_indent(VARIANT_TRUE);
        wrt->put_output(_variant_t((IUnknown*)(IUnknownPtr)stmFile));

        MSXML2::ISAXXMLReaderPtr rdr;
        rdr.CreateInstance("MSXML2.SAXXMLReader");
        rdr->putContentHandler((MSXML2::ISAXContentHandlerPtr)wrt);
        rdr->parse(_variant_t((IUnknown*)(IUnknownPtr)pDoc));

    } catch (_com_error& e) {

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




 Copyright 2008 VALGUS. All Rights Reserved.