下面是加载文件的代码。在单击按钮事件时,调用加载函数,该函数返回XMLElement指针变量。(返回有效地址),但由于发生分段错误而无法使用-> operator访问XMlElement的成员。
with open('output.json', 'w', encoding='utf-8') as file:
df2.reset_index().to_json(file, orient='records', force_ascii=False)
}
下面是单击按钮的代码。
XMLElement *XMLUtilities::load(string filepath)
{
XMLDocument doc;
char *cstr = new char[filepath.length() + 1];
strcpy(cstr, filepath.c_str());
XMLError err=doc.LoadFile(cstr);
XMLElement *root=nullptr;
if(err==XML_ERROR_FILE_NOT_FOUND)
{
return nullptr;
}
else
{
root=doc.FirstChildElement();
cout<<root->Name();
return root;
}
答案 0 :(得分:1)
AS @Sami Kuhmonen在评论中指出,问题在于,当方法 MainWindow 。 on_pushButton_clicked()完成时,所有局部变量都将被破坏,包括< strong> doc 。这会破坏文档中的所有节点,元素……等等,当然包括根节点。
最简单的解决方案是返回文档,而不仅仅是返回根元素。
XMLDocument XMLUtilities::load(string filepath)
{
XMLDocument doc;
// ...
return doc;
}
不幸的是,对于此示例,这是不可能的,因为 tinyxml2 的作者认为允许将整个文档复制到内存中效率不高(这是一件好事)。
我能想到的唯一可能性是实际上在 XMLUtilities 。 load()中读取XML,并返回指向您自己类的根对象的指针,不是 XMLNode 或 XMLElement 。
例如,如果您正在阅读有关汽车的信息,例如:
<cars>
<car plate="000000">
<owner ...
</car>
...
</cars>
您将返回一个指向类 CarsList 的指针,该类表示根元素 cars 。按照您的代码,如果找不到文件或无法检索数据,则该指针将为 nullptr 。
希望这会有所帮助。