zoukankan      html  css  js  c++  java
  • 利用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  
  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/left69/p/5692710.html
Copyright © 2011-2022 走看看