0

我不明白为什么下面的代码不能按预期将一个元素从 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 文档:

InsertFirstChildaddThis...如果节点不属于同一个文档,则返回参数或 0。

基本上,如果节点是由该文档制造的(使用等)NewElement,您只能将节点添加到文档中。NewText

您必须边走边doc1创建相应的节点(使用ShallowClone, 并将它们添加到doc2. 似乎没有DeepClone什么可以为您做这一切。

http://sourceforge.net/p/tinyxml/discussion/42748/thread/820b0377/,“practicevoodoo”建议:

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 回答