c++ - 通过 TinyXML 深度复制 XML

标签 c++ xml tinyxml

我正在使用 tinyxml。

如何复制或创建现有 XMLDocument 的拷贝?

http://www.grinninglizard.com/tinyxmldocs/classTiXmlDocument.html#a4e8c1498a76dcde7191c683e1220882

我浏览了这个链接,上面写着使用克隆 来复制节点。但这是 protected ,我不想从中派生一个类等等。

我也不想将现有的 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);
    }
}

关于c++ - 通过 TinyXML 深度复制 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230111/

相关文章:

c++ - 我的代码中有一个我找不到的错误

c++ - 如何有效地将 vector 重复到cuda中的矩阵?

mysql - 加载 XML INFILE 和子列

c++ - tinyxml。获取节点的全文(或 "raw content")?

c++ - 用作模板默认参数时,不会调用完全专用的重载方法

c++ - 什么时候应该将多线程与 asio 一起使用?

xml - XSLT - 按顺序应用两个不同的模板

java - 删除少量节点的 XQuery

c++ - UTF-8 和 TinyXML

c++ - 链接问题 tinylibxml C++ Ubuntu