C++ 分段读取 XML 个文件

C++ read XML files in pieces

我正在使用 Visual C++ 使用 MsXML6 库进行练习,以摆脱对 python 等解释器语言分析大文件的依赖。 我正在按照 msdn 上的教程进行操作,但是当用 XML 文件替换一个更大的文件(超过 300MB)时,程序显示无法找到该文件的错误并且后续变体为 NULL。

教程:https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms767609(v%3dvs.85)

    HRESULT hr = S_OK;
    IXMLDOMDocument *pXMLDom = NULL;
    IXMLDOMNodeList *pNodes = NULL;
    IXMLDOMNode *pNode = NULL;

    BSTR bstrQuery1 = NULL;
    BSTR bstrQuery2 = NULL;
    BSTR bstrNodeName = NULL;
    BSTR bstrNodeValue = NULL;
    DOMNodeType DOMType;
    VARIANT varNodeValue;
    VARIANT_BOOL varStatus;
    VARIANT varFileName;
    VariantInit(&varFileName);

    CHK_HR(CreateAndInitDOM(&pXMLDom));

    CHK_HR(VariantFromString(L"TestDoc.xml", varFileName));
    CHK_HR(pXMLDom->load(varFileName, &varStatus));
    if (varStatus != VARIANT_TRUE)
    {
        CHK_HR(ReportParseError(pXMLDom, "Failed to load DOM from TestDoc.xml"));
        initSuccessful = false;
    }
    else
    {
        //Assigns the DOM object as a member variable to be used in other methods
        pXMLDomClassVar = pXMLDom;
        initSuccessful = true;
    }

非常感谢您对此提供帮助。

在谈论 XML DOM 时,您应该认为这只是一个通过对 XML 文件的全面分析即时创建的内存数据库。通过 DOM 方法处理大 XML 文件是一种非常糟糕的做法,因为那时会消耗大量内存和低性能。 (内容本身、索引和交叉链接等)即使是 10 Mb 的 XML DOM 在性能方面也是值得注意的,而你要用 30 倍!

相反,在大 XML 文件上,您应该使用 "SAX parsing" 方法,该方法甚至可以在无尽的 XML 流上运行。您只需要存储 XML 个您感兴趣的摘录,而忽略其余部分。