1. 程式人生 > >tinyxml2實現不同xml檔案間節點複製拷貝

tinyxml2實現不同xml檔案間節點複製拷貝

現有A、B兩個xml檔案,想要按照一個順序要求把B中的節點拷貝到A中,之前用insertafterchild函式,總會在afterThis引數判斷時不通過afterThis->_parent != this,百思不得其解。後改變思路並改變函式,使用InsertEndChild函式,順利實現。

思路是,每次執行先將A清空,再從B中按索引條件找到需要的節點複製給A。這樣不管順序要求怎麼變,函式都可以實現相應的功能。

下面上程式碼:

    // TODO:  在此新增命令處理程式程式碼     UpdateData(true);//從介面更新順序要求     tinyxml2::XMLDocument docXmlB;//B.xml     XMLError errXml = docXmlB.LoadFile("B.xml");     if (XML_SUCCESS != errXml)     {         return;     }     tinyxml2::XMLNode* elmtRootB = docXmlB.FirstChild();     const tinyxml2::XMLNode* node = elmtRootB->FirstChild();     bool findB = false;     int i = 0;//遍歷list     bool find = false;//是否找到節點     CString instructname = "";//順序要求,我的是在list列表中得到的     tinyxml2::XMLNode* elmtRootA = docXmlA.FirstChild();     //elmtnode是p_element的節點形式     tinyxml2::XMLNode* vernier = NULL;//遊標     tinyxml2::XMLNode* elmtnode = elmtRootA->FirstChild();     if (elmtnode)//A為空直接往裡新增節點,不空則清空     {         while (elmtnode->NextSibling() != NULL)//迴圈找到A的最後一個子節點         {             elmtnode = elmtnode->NextSibling();         }         for (; elmtnode;)//刪除所有子節點         {             vernier = elmtnode;             elmtnode = elmtnode->PreviousSibling();             elmtRoot->DeleteChild(vernier);         }     }     for (; m_testlist.GetItemText(i, 0) != "";)     {         find = false;         findcommand = false;         instructname = m_testlist.GetItemText(i, 0);//順序要求         //    新建節點,在B中找到instructname的節點         for (node = elmtRootB->FirstChild(); node; node = node->NextSibling())         {             const XMLElement* Bnode = node->ToElement();             const XMLAttribute *Attr = Bnode->FirstAttribute();             while (Attr)             {                 if ((CString)(Attr->Name()) == "name" && (CString)(Attr->Value()) == instructname)                 {                     //找到節點                     findB = true;                 }                 Attr = Attr->Next();             }             if (findB)                 break;         }         tinyxml2::XMLNode* copy = node->DeepClone(&docXmlA);         elmtRootA->InsertEndChild(copy);         i++;     }     docXmlA.SaveFile(docXmlApath);

容易出問題是在最後幾行,

tinyxml2::XMLNode* copy = node->DeepClone(&docXmlA);

node要判斷是不是為NULL;DeepClone的引數是A的文件物件引用;

elmtRootA->InsertEndChild(copy);  用根節點的insertendchild函式,不是用docXmlA。