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

これは「クラッシュ」ではなく、asserttinyxml2 からのものです。「捨てる」ためですnewElemnewElem内で作成しましXMLDocument docたがnewElem、 内の特定の場所に挿入するまで、追跡されていないノードとして「フローティング」していますXMLDocument。を呼び出すと、現在のすべてのノードParseの削除がクリアされます。これは、追跡されていないノードが削除されているという単なる通知です。XMLDocumentassert

いずれかのメソッドを呼び出し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機能は、1 回の操作で要素を作成して挿入するための便利なヘルパー関数 ( ) を提供します。

于 2017-01-04T01:03:37.567 に答える