I have 2 functions:
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");
}
and
void XMLParser::CreateModelLights(pugi::xml_node node)
{
GLuint i = 0;
for (pugi::xml_node entity : node.children())
{
[...]
}
}
I am calling parser.ParseScene("src/xml/scene.xml"); to generate parser.scene and then call parser.CreateModelLights(parser.scene);, but it gives me rubbish data in node parameter / parser.scene.
If I put scene = doc.child("scene"); on CreateModelLight() first line it will parse my data ok in parser.scene, but I don't want to force the node like that because I am calling the function recursively. Ideally I want to parse my XML in ParseScene() and then store it a pugi::xml_node variable declared in the header that I can use in functions like CreateModelLights().
XML looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<scene>
[...]
</scene>


This is not terribly clear in the documentation, but PugiXML uses a fairly common memory management pattern: The
pugi::xml_documentowns the entire XML DOM tree, andpugi::xml_nodeobjects are just shallow pointers into this tree.This means that you need to keep the
pugi::xml_documentobject alive for as long as there arepugi::xml_nodeobjects pointing into it. Probably the quickest way is to promotedocto a member variable.