■
最新のxml paserはmsxml6。でもリリースからだいぶ時間もたち忘れられそうでメモしておく。使い方に癖があって、
#includeではなく、#importでライブラリ情報を動的に取得しなければならない。
しかも、COMは自動的にスマートポインタになる。
#include "stdafx.h"
#import// .NETframework3.0からインストール済み。msxml6.tlh, msxml6.tliを自動生成。 int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);MSXML2::IXMLDOMDocument3Ptr doc; // IXML***Ptrは全てスマートポインタ
doc.CreateInstance( __uuidof(MSXML2::DOMDocument60) );
auto hr = doc->loadXML( L"
test " );
auto root = doc->GetdocumentElement();auto nd = root->firstChild;
// 同じ関数が3種類もある。
auto c = nd->text; // c is "test"auto c1 = nd->Gettext(); // c1 is "test"
BSTR c2;
nd->get_text(&c2);
::SysFreeString(c2); // c2 is "test"return 0;
}
そもそもMSXMLはWindowsの標準ライブラリではなく、ブラウザなどに付属していた。
しかし、なかなか安定せず何度も小修正をくりかしている。http://support.microsoft.com/kb/269238/ja
.NET3.0以降(またはVista以降)から標準でmsxml6はインストールされるようになった。
パーサの規格はFIX(名前空間 MSXML)されていて変更できなくなったためMSXML2が作られたように記憶している。
また、歴史的な理由から重複しているような関数(上のGettext())が多数ある。
ちなみに昔の書き方だと割と面倒であった。
// 昔のプログラム
#include "stdafx.h"
#includeint _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);CComPtr
doc; CLSID clsid;
CLSIDFromProgID( L"MSXML.DOMDocument", &clsid );
::CoCreateInstance( clsid,0,CLSCTX_ALL,IID_IXMLDOMDocument, (void**)&doc);
VARIANT_BOOL bl;
auto hr = doc->loadXML( L"test ", &bl );
CComPtrroot;
hr = doc->get_documentElement( &root );CComPtr
nd;
hr = root->get_firstChild( &nd );
BSTR c2;
nd->get_text(&c2);
::SysFreeString(c2); // c2 is "test"return 0;
}
// IE4の2000年頃
#include "msxml6.tlh" とすると環境を移動した時に問題が起きる。tlh内にtliが絶対パスで記述されているからで、必ず#import