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  
  • 相关阅读:
    功能强大的T4文本模版
    C#中.snk文件的作用
    ASP.NET MVC中实现多个按钮提交的几种方法
    asp.net mvc强大的分页控件MvcPager
    设计模式—观察者模式
    Http响应码

    编码习惯
    vim 快捷键 转
    makefilevvhttp://www.tudou.com/programs/view/e3Z8RbxFIZE/
  • 原文地址:https://www.cnblogs.com/left69/p/5692710.html
Copyright © 2011-2022 走看看