【问题标题】: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 它按预期工作。您能否发布一个答案,以便我可以投票作为解决方案?

标签: c++ c xml xml-parsing pugixml


【解决方案1】:

这在文档中不是很清楚,但 PugiXML 使用了一种相当常见的内存管理模式:pugi::xml_document 拥有整个 XML DOM 树,而pugi::xml_node 对象只是指向这棵树。

这意味着只要有pugi::xml_node 对象指向它,您就需要保持pugi::xml_document 对象处于活动状态。可能最快的方法是将doc 提升为成员变量。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多