C++ читает XML-файлы по частям

Я делаю упражнение с библиотекой MsXML6 с Visual C++, чтобы избавиться от зависимости от языков интерпретатора, таких как python, для анализа больших файлов. Я следовал учебному пособию по msdn, однако при замене XML-файла на гораздо больший (более 300 МБ) программа отображает ошибку, из-за которой не удалось найти файл, и последующим вариантом является 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 ответ

Решение

Говоря о XML DOM, вы должны учитывать, что это просто база данных в памяти, создаваемая на лету посредством полного анализа этого XML-файла. Работа с большими XML-файлами с использованием подхода DOM - очень плохая практика, так как в этом случае потребляется много памяти и снижается производительность. (сам контент, индексы и перекрестные ссылки и т. д.) Даже 10 МБ XML DOM - это заметная вещь с точки зрения производительности, и вы в 30 раз больше!

Вместо этого в больших XML-файлах следует использовать подход "SAX-синтаксический анализ", который может работать даже в бесконечных XML-потоках. Это зависит только от вас, чтобы сохранить интересующие вас фрагменты XML и игнорировать все остальное.

Другие вопросы по тегам