为什么我不能使用 TinyXml2 将一个 XMLDocument 的内容复制到另一个 XMLDocument?
Why can't I copy the contents of an XMLDocument to another XMLDocument using TinyXml2?
我不明白为什么下面的代码无法按预期将一个元素从 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
}
有人可以指出如何改进吗?
来自 TinyXml2 文档:
InsertFirstChild
... Returns the addThis
argument or 0 if the node does not belong to the same document.
基本上,如果节点是由该文档制造的(使用 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;
}
我不明白为什么下面的代码无法按预期将一个元素从 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
}
有人可以指出如何改进吗?
来自 TinyXml2 文档:
InsertFirstChild
... Returns theaddThis
argument or 0 if the node does not belong to the same document.
基本上,如果节点是由该文档制造的(使用 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;
}