TinyXml庫比較小,但功能較爲完善,挺適合用來讀取小塊的xml文件;數據庫
我寫了幾個利用TinyXml讀取和保存數據的例子,你們能夠參考使用;函數
主要是爲了熱更新配置所作的一些函數應用;spa
1 //開始熱更 2 void CLocalConfig::HotUpdateXmlCfg(string filePath) 3 { 4 // 定義一個TiXmlDocument類變量 5 TiXmlDocument Doc; 6 mapTaskInfoCfg mpTaskInfoConfig; 7 map<int,int> mpInsert; 8 if(!Doc.LoadFile(filePath.c_str())) 9 { 10 return; 11 } 12 13 GetAttributeByTaskXml(Doc,1,mpTaskInfoConfig); 14 for(itmapTaskInfoCfg itr = mpTaskInfoConfig.begin();itr != mpTaskInfoConfig.end(); ++itr) 15 { 16 TaskDetail TaskInfo = itr->second; 17 if(TaskInfo.GetNewAble() || TaskInfo.GetModifyAble()) 18 { 19 //insert 插入數據庫 20 if(CDbManager::Instance()->InsertTaskDetail(NULL,TaskInfo)) 21 { 22 //數據庫熱更成功,插入到更新map 23 mpInsert.insert(make_pair(TaskInfo.GetTaskId(),TaskInfo.GetTaskId())); 24 } 25 continue; 26 } 27 } 28 //更新插入的數據 29 if (mpInsert.size() != 0) 30 { 31 //更新剛剛熱更成功的xml表 32 UpdateAttributeByTaskXml(Doc,1,mpInsert); 33 } 34 //保存xml表 35 Doc.SaveFile(filePath.c_str()); 36 } 37 38 //讀取xml表格內容 39 void CLocalConfig::GetAttributeByGrownBagsXml(TiXmlDocument &stDoc,int Flag/*層級*/,mapTaskInfoCfg &mpTaskInfo) 40 { 41 TiXmlElement* pNowElement = stDoc.RootElement(); //root節點 42 //循環Flag次,以指向須要的節點層級 43 while(Flag--){ 44 pNowElement = pNowElement->FirstChildElement(); //指向下一個 45 } 46 while ( pNowElement ) { 47 TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //得到每一級的各類屬性 48 TASK_INFO_DETAIL Config; 49 ZeroMemory(&Config, sizeof(TASK_INFO_DETAIL)); 50 while ( attributeOfStudent ) { 51 switch(string(attributeOfStudent->Name())) 52 { 53 case GROWN_BAGS_CFG_XML_ID: 54 { 55 //數字直接賦值 56 Config.m_iID= atoi(attributeOfStudent->Value()); 57 break; 58 } 59 case GROWN_BAGS_CFG_XML_ID: 60 { 61 //字符串直接拷貝 62 memcpy(Config.m_strName ,attributeOfStudent->Value(),strlen(attributeOfStudent->Value())+1); 63 break; 64 } 65 default: 66 break; 67 } 68 std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;//打印當前的數據看看 69 attributeOfStudent = attributeOfStudent->Next();//指向下一個元素 70 } 71 mpTaskInfo[Config.m_iID] = Config; 72 pNowElement = pNowElement->NextSiblingElement();//指向下一個同級節點 73 } 74 } 75 76 //更新xml節點元素 77 void CLocalConfig::UpdateAttributeByTaskXml(TiXmlDocument &stDoc,int Flag,map<int,int> &mpTaskUpdate) 78 { 79 TiXmlElement* pNowElement = stDoc.RootElement(); //root 80 //循環Flag次,以指向須要的節點層級 81 while(Flag--){ 82 pNowElement = pNowElement->FirstChildElement(); //指向下一個 83 } 84 while ( pNowElement ) { 85 TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //得到每一級的各類屬性 86 while ( attributeOfStudent ) { 87 if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_ID) 88 { 89 //看看是否是這個ID 90 int iTaskId= atoi(attributeOfStudent->Value()); 91 map<int,int>::iterator itr = mpTaskUpdate.find(iTaskId); 92 if(itr == mpTaskUpdate.end()) 93 { 94 break; 95 } 96 } 97 else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_MODIFY) 98 { 99 attributeOfStudent->SetValue("0");//設置屬性爲0,表明已經更新了 100 } 101 else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_NEW) 102 { 103 attributeOfStudent->SetValue("0");//設置屬性爲0,表明已經更新了 104 } 105 else 106 { 107 108 } 109 attributeOfStudent = attributeOfStudent->Next();//指向下一個元素 110 } 111 pNowElement = pNowElement->NextSiblingElement();//指向下一個同級節點 112 } 113 } 114 115