RapidXML抛出异常

RapidXML is throwing exception

本文关键字:抛出异常 RapidXML      更新时间:2023-10-16
     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] = '';
    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';
    }

这是我使用RapidXML为XML解析编写的代码,但它抛出异常"RapidXML::parse_error在内存位置0x0011fc20.."请建议对此进行任何修复。谢谢

您可以通过查看此链接http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1parse__error

来确定导致此问题的确切原因。

特别是(粗体是我的重点)

类rapidxml: parse_error

定义于rapidxml.hpp

解析错误异常。当出现错误时,解析器会抛出此异常发生。使用what()函数获取人类可读的错误消息。使用where()函数获取指向源文本位置的指针检测到错误。

这至少可以让您发现导致异常的原因以及位置。此外,您的代码确实存在可能导致问题的问题。这是从解析函数http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c

的rapidXML描述中获取的

粗体文本由我强调

根据给定的标志解析以零结尾的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()函数来查明错误。在完全完成对doc对象的函数调用之后,还可以尝试将delete语句移动到代码的末尾,因为这也可能导致问题。

你解析的DOM对象文档是基于你在内存中的缓冲区,所以不要删除你的缓冲区或在退出前删除