MSXML4 / FreeThreadedDOMDocument40(COM字符串互操作问题)正在截断大型Xml文件

时间:2009-10-23 10:37:17

标签: c++ xml com msxml

我正在使用以下代码加载大型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时完全一样。

1 个答案:

答案 0 :(得分:0)

看来我是自己愚蠢的受害者 - 事实上Xml /字符串并没有被截断,Visual Studio中的查看器只是骗我。

将字符串输出到文件显示字符串都是应有的。