Анализ TinyXml2 XMLDocument после создания нового сбоя элемента

В TinyXmlv1 я могу создать временный элемент XML, а затем проанализировать документ с помощью

TiXmlDocument doc;
TiXmlElement * element = new TiXmlElement( "Hello" );
TiXmlText * text = new TiXmlText( "World" );
element->LinkEndChild( text );
doc.Parse("<TAGS></TAGS>"); // It OK

Теперь я хочу перейти на TinyXmlv2 следующим образом:

#include "tinyxml2.h"

using namespace tinyxml2;

int main(int argc, char* argv[])
{
    tinyxml2::XMLDocument doc;
    tinyxml2::XMLElement* newElm = doc.NewElement("Hello");
    newElm->SetText("World");

    doc.Parse("<TAGS></TAGS>"); // This will crash

    return 0;
}

Я не могу понять, почему это сбой.

1 ответ

Это не "авария", а assert из tinyxml2, потому что вы "выбрасываете" newElem, Вы создали newElem в XMLDocumentdoc но newElem просто "плавает" как неотслеживаемый узел, пока вы не вставите его в определенное место внутри XMLDocument, призвание Parse очищает XMLDocument удаляя все текущие узлы и assert это просто уведомление о том, что неотслеживаемый узел удаляется.

Позвоните одному из XMLNode::Insert... Способы добавления элементов в документ в соответствующем месте. И, в вашем случае, переместите вызов на Parse создать элемент документа (<TAGS>) до создания дочерних элементов.

Например

#include "tinyxml2.h"

using namespace tinyxml2;

int main(int argc, char* argv[])
{
    XMLDocument doc;
    doc.Parse("<TAGS></TAGS>");

    XMLElement* newElm = doc.NewElement("Hello");
    newElm->SetText("World");

    doc.InsertEndChild(newElem);

    return 0;
}

Мое расширение tinyxml2 предлагает удобную вспомогательную функцию (append_element) создать и вставить элемент в одной операции.

Другие вопросы по тегам