首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型Xml文件被MSXML4 / FreeThreadedDOMDocument40截断(COM字符串互操作问题)

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

Stack Overflow用户
提问于 2009-10-23 10:37:17
回答 1查看 544关注 0票数 0

我使用以下代码加载一个大型Xml文档(~5MB):

代码语言:javascript
复制
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文件(~5MB应该这样做)。

更新:使用MSXML 6进行更新没有什么区别,也可以将异步设置为false,使用get_nodeValue / get_text也没有区别(示例更新)

我注意到,如果我对放在文档末尾的节点执行selectSingleNode,它就能正常工作--看起来文档加载成功,问题是获取单个节点的文本。然而,我很困惑,因为我还没有在互联网上找到有这个问题的其他人。

更新2:问题似乎与COM互操作本身有关--我创建了一个简单的C#类,它做同样的事情,并将其公开为COM对象。我可以看到,虽然Xml在我的C#应用程序中很好,但当我在C++应用程序的调试器中查看它时,它看起来与使用MSXML时完全一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-23 15:57:19

我似乎是自己愚蠢的牺牲品-- Xml /字符串实际上没有被截断,Visual中的查看器只是在欺骗我。

将字符串输出到文件显示字符串都是它们应该做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1612619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档