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。