0

次のコードを使用して、大きな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を使用したときとまったく同じように見えます。

4

1 に答える 1

0

私は自分自身の愚かさの犠牲者だったようです-Xml/文字列は実際には切り捨てられておらず、VisualStudioのビューアは単に私に嘘をついていました。

文字列をファイルに出力すると、文字列がすべて正常であることがわかりました。

于 2009-10-23T15:57:19.920 に答える