2016-12-25 6 views
0

В TinyXmlv1 я могу создать временный Xml элемент затем PARSE документ поTinyXml2 XMLDocument синтаксического анализа после создания нового элемента аварии

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; 
} 

Я не могу понять почему он падает.

ответ

0

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

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

E.g.

#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; 
} 

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

Смежные вопросы