深层通过tinyxml复制XML

Deep Copy an XML via TinyXML

本文关键字:复制 XML tinyxml      更新时间:2023-10-16

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