gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:12 27 4
gpt4 key购买 nike

我正在尝试调试代码中似乎是 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)
    • 注意:注册表项已设置为允许进程大小如此之大,因为 WinXP 的最大有效进程大小 AFAIK 为 2GB)。

关于此调用为何失败的任何想法?

最佳答案

以下代码将从 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,验证尤其如此错误,而不是解析器/格式良好的错误)。

关于c++ - 如何确定对 IXMLDOMDocument::load() 的调用失败的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2144219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com