RapidXML бросает исключение - PullRequest
       16

RapidXML бросает исключение

0 голосов
/ 26 сентября 2011
     ifstream fin("tree.xml");
    if (fin.fail()) return 1;

    fin.seekg(0, ios::end);
    size_t length = fin.tellg();
    fin.seekg(0, ios::beg);
    char* buffer = new char[length + 1];
    fin.read(buffer, length);
    buffer[length] = '\0';

    fin.close();

    xml_document<> doc;
    doc.parse<parse_full>(buffer);

 //   doc.parse<0>(buffer);

    delete [] buffer;

    cout << "The first node is '" << doc.first_node()->name() << "'\n";
    for (xml_node<>* n = doc.first_node("card")->first_node(); n;
        n = n->next_sibling())
    {
        char* v = n->value();
        if (!v || !*v) v = "(empty)";
        cout << n->name() << " : " << v << '\n';
    }

Это код, который я написал для разбора XML с использованием RapidXML, но он выдает исключение «rapidxml :: parse_error в ячейке памяти 0x0011fc20 ..». Пожалуйста, предложите любое исправление для этого.Спасибо

Ответы [ 2 ]

1 голос
/ 11 августа 2012

Вы можете точно определить причину этого, перейдя по этой ссылке http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1parse__error

В частности (жирным шрифтом выделен мой текст)

класс rapidxml :: parse_error

Определено в rapidxml.hpp

Описание

Исключение ошибки разбора. Это исключение выдается анализатором при ошибке происходит. Используйте функцию what () для получения понятного человеку сообщения об ошибке. использование где () функция для получения указателя на позицию в исходном тексте, где ошибка была обнаружена.

это, по крайней мере, позволит вам выяснить, что является причиной исключения, а также местоположение. Кроме того, у вашего кода есть проблема, которая может вызвать проблемы. Это взято из rapidXML-описания функции разбора http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c

жирный текст выделен мной

Анализирует завершенную нулем строку XML в соответствии с заданными флагами. Прошло строка будет изменена парсером, если только Используется флаг rapidxml :: parse_non_destructive. Строка должна сохраняться на весь срок действия документа . В случае ошибки, Будет создано исключение rapidxml :: parse_error.

Но в вашем коде

xml_document<> doc;
doc.parse<parse_full>(buffer);
//   doc.parse<0>(buffer);

delete [] buffer;

cout << "The first node is '" << doc.first_node()->name() << "'\n";

вы удаляете буфер символов, содержащий вашу строку, а затем вызываете функции для объекта doc. Это является нарушением вышеуказанной документации. Я не уверен, является ли это точной причиной вашего исключения, но, безусловно, удаление этого буфера вызовет проблемы. Я бы предложил использовать блок try / catch, чтобы перехватить исключение parse_error, а затем использовать функции where() и what(), чтобы точно определить ошибку. Также попробуйте переместить оператор delete в конец вашего кода после того, как вы полностью завершите вызов функций для объекта doc, так как это также может вызвать проблемы.

0 голосов
/ 27 марта 2015

Ваш анализ документа DOM основан на вашем буфере в памяти, поэтому не удаляйте буфер или удаляйте непосредственно перед выходом

...