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语句移到代码末尾,因为这也可能会引起问题。