利用TinyXml進行數據庫的熱更新

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  
相關文章
相關標籤/搜索