AS @Sami Kuhmonen указал в комментарии, проблема в том, что когда метод MainWindow . on_pushButton_clicked () завершен, все локальные переменные уничтожаются, включая документ . Это уничтожает все узлы, элементы ... и т. Д. Внутри документа, включая, конечно, корневой узел.
Самое простое решение - вернуть документ вместо корневого элемента.
XMLDocument XMLUtilities::load(string filepath)
{
XMLDocument doc;
// ...
return doc;
}
К сожалению, для этого примера это невозможно, поскольку авторы tinyxml2 считают, что было бы неэффективно разрешать копирование всего документа в памяти (что хорошо).
Единственная возможность, о которой я могу думать, - это на самом деле читать XML в XMLUtilities . load () и возвращать указатель на корневой объект ваших собственных классов, а не XMLNode или XMLElement .
Например, если вы читали информацию об автомобилях, например:
<cars>
<car plate="000000">
<owner ...
</car>
...
</cars>
Вы бы вернули указатель на класс CarsList , который будет представлять корневой элемент cars . Следуя вашему коду, этот указатель будет nullptr в случае, если файл не найден или данные не могут быть получены.
Надеюсь, это поможет.