0
     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';
    }

这是我为使用 RapidXML 进行 XML 解析而编写的代码,但它会在内存位置 0x0011fc20 处引发异常“rapidxml::parse_error..”,请为此提出任何修复建议。谢谢

4

2 回答 2

2

您可以通过查看此链接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_ destroy 标志。该字符串必须在文档的整个生命周期内持续存在。如果发生错误,将抛出 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";

您正在删除包含字符串的 char 缓冲区,然后在doc对象上调用函数。这违反了上述文档。我不确定这是否是您异常的确切原因,但删除该缓冲区肯定会导致问题。我建议使用 try/catch 块来捕获 parse_error 异常,然后使用where()andwhat()函数来查明错误。在完全完成对doc对象的函数调用后,还可以尝试将 delete 语句移到代码末尾,因为这也可能导致问题。

于 2012-08-10T21:29:17.110 回答
0

您解析的 DOM 对象文档基于内存中的缓冲区,因此不要删除缓冲区或在退出前删除

于 2015-03-27T07:58:44.010 回答