这可能更多的是一个c++的问题,而不是rapidxml的问题,我仍然在学习c++,如果这是一个非常愚蠢的问题,非常抱歉。
我正在尝试加载try块中的XML文件:
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try
{
rapidxml::file<> file((data_folder + "\\application.xml").c_str());
doc.parse<0>(file.data());
root_node = doc.first_node("Application");
std::cout << root_node->first_node("AppMeta");
}
catch (const std::runtime_error& e)
{
// ...
}
这段代码正确地打印出“AppMeta”节点的指针。问题是,当我将cout
行移动到块之外时:
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try
{
rapidxml::file<> file((data_folder + "\\application.xml").c_str());
doc.parse<0>(file.data());
root_node = doc.first_node("Application");
}
catch (const std::runtime_error& e)
{
// ...
}
std::cout << root_node->first_node("AppMeta");
在这种情况下,控制台上显示的值是nullptr (00000000)。为什么会发生这种情况,以及在try catch块之后如何访问XML dom?
发布于 2019-10-29 21:19:53
结束try块还会调用rapidxml::file<> file
的析构函数,这就是您不能再访问内容的原因。由于将文件向上移动一个作用域,在try块之外将无法捕获构造错误,请将数据复制到具有更大作用域的变量中。rapidxml::file<>::data()
只是返回一个指向数据的指针,但是如果指针不再存在,就不能使用这个函数。
documentation for the file class说,“数据将自动被析构程序销毁。”
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
std::string copied_data;
try
{
rapidxml::file<> file((data_folder + "\\application.xml").c_str());
copied_data = file.data();
doc.parse<0>(copied_data.c_str());
root_node = doc.first_node("Application");
}
catch (const std::runtime_error& e)
{
// ...
}
std::cout << root_node->first_node("AppMeta");
发布于 2019-10-30 00:42:02
由于try块的唯一目的是捕获该构造函数抛出的异常,因此不能将file()上移到作用域。我最终通过使用new
关键字实例化该文件解决了这个问题。
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try
{
rapidxml::file<> *file = new rapidxml::file<>((data_folder + "\\application.xml").c_str());
doc.parse<0>(file->data());
}
catch (const std::runtime_error& e)
{
Utils::exitError(Utils::format("Unable to load the application data.\nDetails: %s", e.what()));
return;
}
root_node = doc.first_node("Application");
std::cout << root_node->first_node("AppMeta")->name();
https://stackoverflow.com/questions/58608175
复制相似问题