属性

属性を書き込む

このエントリーをはてなブックマークに追加
最終更新日 2016-12-31

次に示すのは、XML 要素の属性を書き込む例です。プログラムと同じフォルダに sample.xml というファイルを作成します。

プロジェクトファイル ダウンロード

// stdafx.h
#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

#include <atlbase.h>  // CComPtrを使用するため

#include <xmllite.h>
#pragma comment(lib, "xmllite.lib")
// SampleProject.cpp
#include "stdafx.h"

void Run()
{
    CComPtr<IXmlWriter> pWriter;
    if(FAILED(CreateXmlWriter(__uuidof(IXmlWriter), reinterpret_cast<void**>(&pWriter), 0))){
        MessageBox(NULL, _T("CreateXmlWriter失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // XMLファイルパス作成
    TCHAR xml[MAX_PATH];
    GetModuleFileName(NULL, xml, sizeof(xml) / sizeof(TCHAR));
    PathRemoveFileSpec(xml);
    PathAppend(xml, _T("sample.xml"));

    // ファイルストリーム作成
    CComPtr<IStream> pStream;
    if(FAILED(SHCreateStreamOnFile(xml, STGM_CREATE | STGM_WRITE, &pStream))){
        MessageBox(NULL, _T("SHCreateStreamOnFile失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    if(FAILED(pWriter->SetOutput(pStream))){
        MessageBox(NULL, _T("SetOutput失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // インデント有効化
    if(FAILED(pWriter->SetProperty(XmlWriterProperty_Indent, TRUE))){
        MessageBox(NULL, _T("SetProperty失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // <?xml version="1.0" encoding="UTF-8"?>
    if(FAILED(pWriter->WriteStartDocument(XmlStandalone_Omit))){
        MessageBox(NULL, _T("WriteStartDocument失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // <sample>
    if(FAILED(pWriter->WriteStartElement(NULL, L"sample", NULL))){
        MessageBox(NULL, _T("WriteStartElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // <requirement>
    //   <name type="ヘッダ">XmlLite.h</name>
    // </requirement>
    if(FAILED(pWriter->WriteStartElement(NULL, L"requirement", NULL))){
        MessageBox(NULL, _T("WriteStartElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteStartElement(NULL, L"name", NULL))){
        MessageBox(NULL, _T("WriteStartElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteAttributeString(NULL, L"type", NULL, L"ヘッダ"))){
        MessageBox(NULL, _T("WriteAttributeString失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteString(L"XmlLite.h"))){
        MessageBox(NULL, _T("WriteString失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteFullEndElement())){
        MessageBox(NULL, _T("WriteFullEndElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteFullEndElement())){
        MessageBox(NULL, _T("WriteFullEndElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // <requirement>
    //   <name type="ライブラリ">XmlLite.lib</name>
    // </requirement>
    if(FAILED(pWriter->WriteStartElement(NULL, L"requirement", NULL))){
        MessageBox(NULL, _T("WriteStartElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteStartElement(NULL, L"name", NULL))){
        MessageBox(NULL, _T("WriteStartElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteAttributeString(NULL, L"type", NULL, L"ライブラリ"))){
        MessageBox(NULL, _T("WriteAttributeString失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteString(L"XmlLite.lib"))){
        MessageBox(NULL, _T("WriteString失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteFullEndElement())){
        MessageBox(NULL, _T("WriteFullEndElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }
    if(FAILED(pWriter->WriteFullEndElement())){
        MessageBox(NULL, _T("WriteFullEndElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    // 自動的に<sample>が閉じられる
    if(FAILED(pWriter->WriteEndDocument())){
        MessageBox(NULL, _T("WriteEndDocument失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    if(FAILED(pWriter->Flush())){
        MessageBox(NULL, _T("Flush失敗"), _T("警告"), MB_OK | MB_ICONWARNING);
        return;
    }

    MessageBox(NULL, _T("完了"), _T("結果"), MB_OK | MB_ICONINFORMATION);
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    Run();

    return 0;
}

XML 要素の属性を書き込むためには、まず、IXmlWriter::WriteStartElement() を呼び出して要素の開始タグを書き込み、 次に IXmlWriter::WriteAttributeString() を呼び出して属性名と属性値を書き込みます。 次に IXmlWriter::WriteString() を呼び出して要素のテキストを書き込み、 最後に IXmlWriter::WriteFullEndElement() を呼び出して要素の終了タグを書き込みます。

以下に示すのが、作成される XML ファイルの例です。エンコードはデフォルトで UTF-8 になります。

// sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<sample>
  <requirement>
    <name type="ヘッダ">XmlLite.h</name>
  </requirement>
  <requirement>
    <name type="ライブラリ">XmlLite.lib</name>
  </requirement>
</sample>