Анализ 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
в XMLDocument
doc
но 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
) создать и вставить элемент в одной операции.