C++ XML的建立、讀取和修改(一)
阿新 • • 發佈:2018-11-23
跟C#不太一樣,需要呼叫一個TinyXML庫來生成XML,庫的原始碼地址為https://github.com/leethomason/tinyxml2,找到“clone or down”進行下載,,解壓之後,將tinyxml2.h
和 tinyxml2.cpp
放入工程檔案中,呼叫方式為
#include "tinyxml2.h"
using namespace tinyxml2;
把原始碼沾一下
#include "ConfigureSetting.h" #include "tinyxml2.h" using namespace tinyxml2; /* 建立,或者初始化xml */ void generate_XML(string path) { XMLDocument doc; XMLDeclaration *dec = doc.NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\""); doc.InsertFirstChild(dec); //建立演算法主節點 XMLElement* ALgorithm = doc.NewElement("Algorithm"); doc.InsertEndChild(ALgorithm); //建立演算法分支點 XMLElement* D1 = doc.NewElement("D1"); ALgorithm->InsertEndChild(D1); //建立濾波演算法分支點 XMLElement* D1_filter = doc.NewElement("D1_filter"); D1->InsertEndChild(D1_filter); //建立中值濾波演算法分支點 XMLElement* median_blur = doc.NewElement("median_blur"); median_blur->SetAttribute("width","3"); median_blur->SetAttribute("cut_boundary","3"); D1_filter->InsertEndChild(median_blur); //建立均值濾波演算法分支點 XMLElement* aver_blur = doc.NewElement("aver_blur"); aver_blur->SetAttribute("width","3"); D1_filter->InsertEndChild(aver_blur); const char* path_save = path.c_str(); doc.SaveFile(path_save,false); } /* 新增節點 addposion,從外到新增節點的路徑 hierachy,節點的層數,包括子元素 attributes,新增元素 count_attributes,元素個數 flag,為1時,在子節點新增,為2時,在兄弟節點新增 */ int add_XML(string path, string* addposion, int hierachy, string * attributes, int count_attributes,int flag) { XMLDocument doc; const char* path_add = path.c_str(); if (doc.LoadFile(path_add)) return 0; const char* first_posion = (addposion[0]).c_str(); XMLElement *current_root = doc.FirstChildElement(first_posion);//翻查主節點 for (int i = 0; i < hierachy - 1 - flag; i++) { const char* current_posion = addposion[i+1].c_str(); current_root = current_root->FirstChildElement(current_posion);//翻查分節點 } const char* final_posion = (addposion[hierachy - 1]).c_str(); XMLElement *final_root = doc.NewElement(final_posion); for (int i = 0; i < count_attributes/2;i++) { const char* s1 = attributes[2 * i].c_str(); const char* s2 = attributes[2*i+1].c_str(); final_root->SetAttribute(s1,s2); } current_root->InsertEndChild(final_root); doc.SaveFile(path_add, false); return 1; } /* 刪除給定節點 */ int delete_XML(string path, string* addposion, int hierachy) { XMLDocument doc; const char* path_delete = path.c_str(); if (doc.LoadFile(path_delete)) return 0; const char* first_posion = (addposion[0]).c_str(); XMLElement *current_root = doc.RootElement(); for (int i = 0; i < hierachy-2;i++) { const char* current_posion = addposion[i+1].c_str(); current_root = current_root->FirstChildElement(current_posion); } const char* final_posion = addposion[hierachy-1].c_str(); XMLElement *finel_root = current_root->FirstChildElement(final_posion); current_root->DeleteChild(finel_root); doc.SaveFile(path_delete, false); return 1; } /* 查詢節點的子節點 */ int find_XML(string path, string* addposion, int hierachy, vector<string> &vs) { XMLDocument doc; const char* path_delete = path.c_str(); if (doc.LoadFile(path_delete)) return 0; const char* first_posion = (addposion[0]).c_str(); XMLElement *current_root = doc.RootElement(); for (int i = 0; i < hierachy - 1; i++) { const char* current_posion = addposion[i + 1].c_str(); current_root = current_root->FirstChildElement(current_posion); } const char* final_posion = addposion[hierachy - 1].c_str(); XMLElement* final_root = current_root->FirstChildElement(); if( final_root == NULL) return 0; while (final_root!=NULL) { string name(final_root->Name()); vs.push_back(name); final_root=final_root->NextSiblingElement(); } return 1; } /* 修改節點屬性 */ int updata_XML(string path, string* updataposion, int hierachy, string attributes) { XMLDocument doc; const char* path_updata = path.c_str(); if (doc.LoadFile(path_updata)) return 0; const char* first_posion = (updataposion[0]).c_str(); XMLElement *current_root = doc.RootElement(); for (int i = 0; i < hierachy - 3; i++) { const char* current_posion = updataposion[i + 1].c_str(); current_root = current_root->FirstChildElement(current_posion); } const char* final_posion = updataposion[hierachy - 2].c_str(); XMLElement* final_root = current_root->FirstChildElement(); if (final_root == NULL) return 0; final_root->SetAttribute(updataposion[hierachy -1].c_str(), attributes.c_str()); doc.SaveFile(path_updata, false); return 1; }