gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:14:27 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com