次に示すのは、UTF-16 の 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; } // エンコード指定 CComPtr<IXmlWriterOutput> pWriterOutput; if(FAILED(CreateXmlWriterOutputWithEncodingName(pStream, NULL, L"UTF-16", &pWriterOutput))){ MessageBox(NULL, _T("CreateXmlWriterOutputWithEncodingName失敗"), _T("警告"), MB_OK | MB_ICONWARNING); return; } if(FAILED(pWriter->SetOutput(pWriterOutput))){ 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-16"?> 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> // <type>ヘッダ</type> // <name>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->WriteElementString(NULL, L"type", NULL, L"ヘッダ"))){ MessageBox(NULL, _T("WriteElementString失敗"), _T("警告"), MB_OK | MB_ICONWARNING); return; } if(FAILED(pWriter->WriteElementString(NULL, L"name", NULL, L"XmlLite.h"))){ MessageBox(NULL, _T("WriteElementString失敗"), _T("警告"), MB_OK | MB_ICONWARNING); return; } if(FAILED(pWriter->WriteFullEndElement())){ MessageBox(NULL, _T("WriteFullEndElement失敗"), _T("警告"), MB_OK | MB_ICONWARNING); return; } // <requirement> // <type>ライブラリ</type> // <name>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->WriteElementString(NULL, L"type", NULL, L"ライブラリ"))){ MessageBox(NULL, _T("WriteElementString失敗"), _T("警告"), MB_OK | MB_ICONWARNING); return; } if(FAILED(pWriter->WriteElementString(NULL, L"name", NULL, L"XmlLite.lib"))){ MessageBox(NULL, _T("WriteElementString失敗"), _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 を読み込む際のエンコードを指定するためには、まず、CreateXmlWriterOutputWithEncodingName() を呼び出します。 引数は順に、ストリームへのポインタ、ユーザがメモリ割り当てを制御するための IMalloc 実装へのポインタ、 エンコード名、出力オブジェクトを示す IXmlWriterOutput のスマートポインタへのポインタです。 次に、IXmlWriter::SetOutput() を呼び出して出力オブジェクトを関連付けます。
以下に示すのが、作成される XML ファイルの例です。
// sample.xml <?xml version="1.0" encoding="UTF-16"?> <sample> <requirement> <type>ヘッダ</type> <name>XmlLite.h</name> </requirement> <requirement> <type>ライブラリ</type> <name>XmlLite.lib</name> </requirement> </sample>