【问题标题】:Deep Copy an XML via TinyXML通过 TinyXML 深度复制 XML
【发布时间】:2015-05-14 05:45:26
【问题描述】:

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

【问题讨论】:

    标签: c++ xml tinyxml


    【解决方案1】:

    这是我写来做一个深拷贝的东西。它获取源节点并将其复制到目标节点、子节点和所有节点下。内存取自目标节点的上下文。希望这对您来说是一个正确方向的开始。

    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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我找到了这个,我认为这可能会对你有所帮助。

      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 );
      

      【讨论】:

      猜你喜欢
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多