代码之家  ›  专栏  ›  技术社区  ›  LeopardSkinPillBoxHat

如何确定调用IxmldomDocument::Load()失败的原因?

  •  5
  • LeopardSkinPillBoxHat  · 技术社区  · 14 年前

    我正在尝试调试代码中似乎是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() (用*标记)失败-低,正在返回 S_FALSE .

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

    这个 MSDN page 因为这种方法似乎不能提供很多洞察。

    我有一些预感:

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

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

    2 回复  |  直到 14 年前
        1
  •  10
  •   Phil Booth    14 年前

    下面的代码将从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中包含错误源行。 nLine nColumn 应该设置为错误的行号和列,尽管实际上这两个值并不总是可靠的设置(IIRC,这对于验证错误尤其如此,而不是解析器/格式良好的错误)。

        2
  •  0
  •   shmia    14 年前

    如果XML文件是由另一个任务打开的或处理load()方法 无法加载文件,但它没有说明加载失败。 我认为这种行为是一种缺陷。

    所以您必须检查documentElement属性-如果它为空,那么load()也会失败。