为啥pugixml解析的数据会丢失在另一个函数中?
Posted
技术标签:
【中文标题】为啥pugixml解析的数据会丢失在另一个函数中?【英文标题】:Why is the data parsed by pugixml lost in another function?为什么pugixml解析的数据会丢失在另一个函数中? 【发布时间】:2022-01-12 19:05:57 【问题描述】:我有两个功能:
void XMLParser::ParseScene(const char* path)
// Load the XML file
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(path);
scene = doc.child("scene");
和
void XMLParser::CreateModelLights(pugi::xml_node node)
GLuint i = 0;
for (pugi::xml_node entity : node.children())
[...]
我正在调用parser.ParseScene("src/xml/scene.xml");
来生成parser.scene
,然后调用parser.CreateModelLights(parser.scene);
,但它在node
参数/parser.scene
中给了我垃圾数据。
如果我将scene = doc.child("scene");
放在CreateModelLight()
第一行,它将在parser.scene
中解析我的数据,但我不想像那样强制节点,因为我正在递归调用该函数。理想情况下,我想在 ParseScene()
中解析我的 XML,然后将其存储在标头中声明的 pugi::xml_node
变量中,我可以在 CreateModelLights()
等函数中使用它。
XML 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<scene>
[...]
</scene>
我得到的垃圾数据:
我应该得到的数据:
【问题讨论】:
这是一个变相的“悬空指针”问题:所有pugi::xml_node
对象引用pugi::xml_document
内的数据。只要您有指向它的 pugi::xml_node
对象,您就应该保持 pugi::xml_document
活动。
我明白了。所以如果我动态分配文档并销毁文档,当我完成后我应该不会再遇到这个问题,对吧?
正确。就像让doc
成为XMLParser
的成员一样简单。
@Botje 它按预期工作。您能否发布一个答案,以便我可以投票作为解决方案?
【参考方案1】:
这在文档中不是很清楚,但 PugiXML 使用了一种相当常见的内存管理模式:pugi::xml_document
拥有整个 XML DOM 树,而pugi::xml_node
对象只是指向这棵树。
这意味着只要有pugi::xml_node
对象指向它,您就需要保持pugi::xml_document
对象处于活动状态。可能最快的方法是将doc
提升为成员变量。
【讨论】:
以上是关于为啥pugixml解析的数据会丢失在另一个函数中?的主要内容,如果未能解决你的问题,请参考以下文章
当我在 plotly 中使用 ggplotly 函数时,为啥文本注释会丢失?