利用TinyXml进行数据库的热更新

TinyXml库比较小,但功能较为完善,挺适合用来读取小块的xml文件;

我写了几个利用TinyXml读取和保存数据的例子,大家可以参考使用;

主要是为了热更新配置所做的一些函数应用;

  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  
原文地址:https://www.cnblogs.com/left69/p/5692710.html