0

以下のコードが、1 つの要素を doc1 から doc2 にコピーする意図どおりに機能しない理由がわかりません。

void test_xml(){
using namespace tinyxml2;
XMLDocument doc1, doc2;
XMLPrinter printer;

doc1.LoadFile("./res/xml/basic.xml");
if(doc1.Error())
    std::cout << doc1.ErrorName();
doc1.Print(&printer);
std::cout << printer.CStr(); // prints "</atag>" without quotes
printer.ClearBuffer();

doc2.InsertFirstChild(doc1.RootElement());
if(doc2.Error())
    std::cout << doc2.ErrorName(); // doesn't run, there's no error
doc2.Print(&printer);
std::cout << printer.CStr(); // prints nothing, no child got inserted to doc2
std::cout << doc2.NoChildren(); //prints "1" meaning we didn't insert anything
}

誰かがこれを改善する方法を指摘できますか?

4

1 に答える 1

0

TinyXml2 ドキュメントから:

InsertFirstChild...addThis引数を返すか、ノードが同じドキュメントに属していない場合は 0 を返します。

基本的に、ノードがドキュメントによって作成された場合にのみノードをドキュメントに追加できます ( などを使用NewElement) NewText

doc1対応するノードを作成しながら ( を使用してShallowClone、 に追加する必要があります。すべてを行う必要doc2はないようです。DeepClone

http://sourceforge.net/p/tinyxml/discussion/42748/thread/820b0377/で、「practisevoodoo」は次のように提案しています。

XMLNode *deepCopy( XMLNode *src, XMLDocument *destDoc )
{
    XMLNode *current = src->ShallowClone( destDoc );
    for( XMLNode *child=src->FirstChild(); child; child=child->NextSibling() )
    {
        current->InsertEndChild( deepCopy( child, destDoc ) );
    }

    return current;
}
于 2015-12-17T14:31:32.467 に答える