0

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

我不明白为什么它会崩溃。

4

1 回答 1

0

这不是“崩溃”,而是assert来自 tinyxml2,因为您正在“扔掉” newElem。您在其中创建newElemXMLDocument 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) 以在单个操作中创建和插入元素。

于 2017-01-04T01:03:37.567 回答