C ++分段读取XML文件

时间:2018-06-25 13:47:52

标签: c++ xml msxml6

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

真的很感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在谈论XML DOM时,您应该认为这只是通过对XML文件进行全面分析而即时创建的内存数据库。通过DOM方法处理大型XML文件是一种非常糟糕的做法,因为这样会占用大量内存并降低性能。 (内容本身,索引和交叉链接等。)就性能而言,即使10 Mb的XML DOM也是值得注意的事情,而您要付出的是它的30倍!

相反,在大XML文件上,您应该使用“ SAX解析”方法,该方法甚至可以在无穷无尽的XML流上运行。您可以存储感兴趣的XML摘录,而忽略其余内容。