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解析而编写的代码,但是它引发了异常“ 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";


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

10-08 11:38