C ++ читает XML-файлы по частям - PullRequest
0 голосов
/ 25 июня 2018

Я выполняю упражнение с библиотекой 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 Ответ

0 голосов
/ 25 июня 2018

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

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

...