次のコードを使用して、大きなXmlドキュメント(〜5 MB)をロードしています。
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
HRESULT hr;
CComPtr< IXMLDOMDocument > spXmlDocument;
hr = spXmlDocument.CoCreateInstance(__uuidof(FreeThreadedDOMDocument60)), __uuidof(FreeThreadedDOMDocument60);
if(FAILED(hr)) return FALSE;
spXmlDocument->put_preserveWhiteSpace(VARIANT_TRUE);
spXmlDocument->put_async(VARIANT_FALSE);
spXmlDocument->put_validateOnParse(VARIANT_FALSE);
VARIANT_BOOL bLoadSucceeded = VARIANT_FALSE;
hr = spXmlDocument->load( CComVariant( L"C:\\XMLFile1.xml" ), &bLoadSucceeded );
if(FAILED(hr) || bLoadSucceeded==VARIANT_FALSE) return FALSE;
CComVariant bstrDoc;
hr = spXmlDocument->get_nodeValue(&bstrDoc);
CComPtr< IXMLDOMNode > spNode;
hr = spXmlDocument->selectSingleNode(CComBSTR(L"//SpecialNode"), &spNode );
}
bstrDocの内容が切り捨てられていることがわかりました(例外はありません/失敗したHResults)
誰もが理由を知っていますか?要素だけの大きなXmlファイルを作成するだけでこれを自分で試すことができます<xml></xml>
(最大5 MBで実行できます)
更新: MSXML 6を使用するように更新しても違いはなく、Asyncをfalseに設定し、get_nodeValue / get_textを使用しても違いはありません(サンプルが更新されました)
ドキュメントの最後に配置されたノードに対してselectSingleNodeを実行した場合、正常に機能していることに気付きました。ドキュメントは正常に読み込まれ、代わりに単一ノードのテキストを取得することに問題があります。しかし、インターネット上でこの問題を抱えている人をまだ見つけていないので、私は困惑しています。
更新2:問題はCOM相互運用機能自体に関連しているようです-同じことを行う単純なC#クラスを作成し、それをCOMオブジェクトとして公開しました。XmlはC#アプリでは問題ありませんが、C ++アプリのデバッガーで見ると、MSXMLを使用したときとまったく同じように見えます。