我正在使用tinyxml。
如何复制或创建现有Xmldocument的副本?
http://www.grinninglizard.com/tinyxmldocs/classtixmldocument.html#a4e8c1498a76dcde7191c683e1220882
我浏览了此链接,该链接说使用 clone 复制节点。但这是受保护的,我不想从中衍生出一堂课。
我也不想将现有的xmldocument保存到文件中,然后制作另一个xmldocument对象读取文件以包含其副本。
我也无法使用 memcpy 进行深层副本,因为我不知道整个XML的大小。
我也不想让两个对象一个接一个地使用:
XMLDocumentObj1 = add_some_data
XMLDocumentObj2 = add_the_same_data, and so on
我想要第二份副本的主要原因是,第一个可以通过代码的不同部分修改,而在多个位置则"读取"相同的副本。我需要确保读取Xmldocument时不会发生任何错误,因为有可能通过运行线程在后台修改了这一点,而且我没有程序崩溃。
这是我写的要进行深层复制的事情。它获取源节点并在目标节点,儿童和所有内容下复制它。内存是从目标节点的上下文中获取的。希望这对您来说是正确的方向。
void CopyNode(tinyxml2::XMLNode *p_dest_parent, const tinyxml2::XMLNode *p_src)
{
// Protect from evil
if (p_dest_parent == NULL || p_src == NULL)
{
return;
}
// Get the document context where new memory will be allocated from
tinyxml2::XMLDocument *p_doc = p_dest_parent->GetDocument();
// Make the copy
tinyxml2::XMLNode *p_copy = p_src->ShallowClone(p_doc);
if (p_copy == NULL)
{
// Error handling required (e.g. throw)
return;
}
// Add this child
p_dest_parent->InsertEndChild(p_copy);
// Add the grandkids
for (const tinyxml2::XMLNode *p_node = p_src->FirstChild(); p_node != NULL; p_node = p_node->NextSibling())
{
CopyNode(p_copy, p_node);
}
}
我找到了这个,我认为这可能会对您有所帮助。
https://github.com/leethomason/tinyxml2/blob/master/xmltest.cpp
const char* pub = "<?xml version='1.0'?> <element><sub/></element> <!--comment--> <!DOCTYPE>";
XMLDocument doc;
doc.Parse( pub );
XMLDocument clone;
for( const XMLNode* node=doc.FirstChild(); node; node=node->NextSibling() ) {
XMLNode* copy = node->ShallowClone( &clone );
clone.InsertEndChild( copy );
}
clone.Print();
int count=0;
const XMLNode* a=clone.FirstChild();
const XMLNode* b=doc.FirstChild();
for( ; a && b; a=a->NextSibling(), b=b->NextSibling() ) {
++count;
XMLTest( "Clone and Equal", true, a->ShallowEqual( b ));
}
XMLTest( "Clone and Equal", 4, count );