最新の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;
}

そもそもMSXMLWindowsの標準ライブラリではなく、ブラウザなどに付属していた。
しかし、なかなか安定せず何度も小修正をくりかしている。http://support.microsoft.com/kb/269238/ja
.NET3.0以降(またはVista以降)から標準でmsxml6はインストールされるようになった。
パーサの規格はFIX(名前空間 MSXML)されていて変更できなくなったためMSXML2が作られたように記憶している。
また、歴史的な理由から重複しているような関数(上のGettext())が多数ある。
ちなみに昔の書き方だと割と面倒であった。

// 昔のプログラム
#include "stdafx.h"
#include

int _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 );

CComPtr root;
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 としなければならない。