通过TinyXML深度复制XML

Dav*_*uiz 1 c++ xml tinyxml

我正在使用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时不会发生任何错误,因为有可能该线程已在后台被正在运行的线程修改,并且没有程序崩溃。

prc*_*arp 5

下面是我写的做了深刻的副本。它采用目标节点,孩子和所有在源节点,并将其复制。内存是从目的节点的背景下采取的。我们希望,这是在为你的方向是正确的开始。

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)