首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定为什么调用IXMLDOMDocument::load()失败?

如何确定为什么调用IXMLDOMDocument::load()失败?
EN

Stack Overflow用户
提问于 2010-01-27 02:37:06
回答 2查看 6.5K关注 0票数 5

我正在尝试调试代码中似乎是XML解析问题的部分。我已经将其隔离为以下代码片段:

代码语言:javascript
复制
HRESULT
CXmlDocument::Load(IStream* Stream)
{
    CComVariant xmlSource(static_cast<IUnknown*>(Stream));
    VARIANT_BOOL isSuccessful;
  * HRESULT hr = m_pXmlDoc->load(xmlSource, &isSuccessful);
    return (hr == S_FALSE) ? E_FAIL : hr;
}

注意: m_pXmlDocCComPtr<IXMLDOMDocument>类型的。

似乎对IXMLDOMDocument::load()的调用(标记为*)失败了- IOW,它正在返回S_FALSE

我无法进入load()来确定其失败的原因,因为它是一个COM调用。

这个方法的MSDN页面似乎没有给出太多的洞察力。

我有几个预感:

  • XML格式不太好。
  • XML文件太大(大约120 XML)
  • 这是一个与内存相关的问题(进程大小在故障时达到> 2GB ) 。
    • 注意:注册表项已被设置为允许进程大小这么大,因为WinXP的最大有效进程大小是2GB)。

对于这个电话为什么会失败有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-27 11:09:29

下面的代码将从DOM及其在源XML中的位置获取特定的解析器错误。

代码语言:javascript
复制
CComPtr<IXMLDOMParseError> pError;
CComBSTR sReason, sSource;
long nLine = 0, nColumn = 0;

m_pXmlDoc->get_parseError(&pError);
if(pError)
{
    pError->get_reason(&sReason);
    pError->get_srcText(&sSource);
    pError->get_line(&nLine);
    pError->get_linepos(&nColumn);
}

sReason将被错误消息填充。sSource将在XML中包含错误的源行。nLinenColumn应该设置为错误的行号和列,尽管在实践中这两个错误并不总是可靠地设置(iirc,对于验证错误尤其如此,而不是解析器/格式良好的错误)。

票数 10
EN

Stack Overflow用户

发布于 2010-09-24 16:43:16

如果XML文件是由另一个Task或Proccess打开的,那么Load()方法将无法加载该文件,但它并不表示加载失败。我认为这种行为是一种错误。

因此,您必须检查属性documentElement -如果属性为null,load()也失败了。

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

https://stackoverflow.com/questions/2144219

复制
相关文章

相似问题

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