如何确定对IXMLDOMDocument :: load()的调用失败的原因?

时间:2010-01-27 02:37:07

标签: c++ xml com

我正在尝试调试代码中似乎是XML解析问题的内容。我已将其分离到以下代码段:

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_pXmlDoc属于CComPtr<IXMLDOMDocument>类型。

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

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

这种方法的MSDN page似乎没有提供很多见解。

我有几个预感:

  • XML格式不正确
  • XML文件太大(大约120MB)
  • 这是与内存相关的问题(进程大小在失败时达到> 2GB)
    • NB:已设置注册表项以允许进程大小如此,因为WinXP的最大有效进程大小为AGBIK,为2GB)。

关于为什么这个电话会失败的任何想法?

2 个答案:

答案 0 :(得分:10)

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

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,尤其是验证错误,而不是解析器/良好的形式)。

答案 1 :(得分:0)

如果XML文件由另一个Task打开,或者使用Load()方法 无法加载文件但它没有说明加载失败。 我认为这种行为是一个错误。

所以你必须检查Property documentElement - 如果它是null,load()也失败了。

相关问题