我正在使用tinyxml。
如何复制或创建现有XMLDocument的副本?
http://www.grinninglizard.com/tinyxmldocs/classTiXmlDocument.html#a4e8c1498a76dcde7191c683e1220882
我浏览了该链接,该链接说使用克隆来复制节点。但这是受保护的,我不想去从此类之类派生一个类。
我也不想将现有的XMLDocument保存到文件中,然后使另一个XMLDocument对象读取该文件以获取其副本。
我也无法使用memcpy执行深层复制,因为我不知道整个XML的大小。
我也不想让一个接一个地使用两个对象,例如:
XMLDocumentObj1 = add_some_data
XMLDocumentObj2 = add_the_same_data, and so on
Run Code Online (Sandbox Code Playgroud)
我想要第二个副本的主要原因是,第一个副本可能会被代码的不同部分修改,而同一副本正在多个地方“读取”。我需要确保读取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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |