首页 > 解决方案 > C++ 分段读取 XML 文件

问题描述

我正在使用 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;
    }

我真的很感激这方面的一些帮助。

标签: c++xmlmsxml6

解决方案


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

相反,在大型 XML 文件上,您应该使用“SAX 解析”方法,这种方法甚至可以在无穷无尽的 XML 流上运行。存储您感兴趣的 XML 摘录完全取决于您,而忽略其余部分。


推荐阅读