//开始热更 void CLocalConfig::HotUpdateXmlCfg(string filePath) { // 定义一个TiXmlDocument类变量 TiXmlDocument Doc; mapTaskInfoCfg mpTaskInfoConfig; map<int,int> mpInsert; if(!Doc.LoadFile(filePath.c_str())) { return; } GetAttributeByTaskXml(Doc,1,mpTaskInfoConfig); for(itmapTaskInfoCfg itr = mpTaskInfoConfig.begin();itr != mpTaskInfoConfig.end(); ++itr) { TaskDetail TaskInfo = itr->second; if(TaskInfo.GetNewAble() || TaskInfo.GetModifyAble()) { //insert 插入数据库 if(CDbManager::Instance()->InsertTaskDetail(NULL,TaskInfo)) { //数据库热更成功,插入到更新map mpInsert.insert(make_pair(TaskInfo.GetTaskId(),TaskInfo.GetTaskId())); } continue; } } //更新插入的数据 if (mpInsert.size() != 0) { //更新刚刚热更成功的xml表 UpdateAttributeByTaskXml(Doc,1,mpInsert); } //保存xml表 Doc.SaveFile(filePath.c_str()); } //读取xml表格内容 void CLocalConfig::GetAttributeByGrownBagsXml(TiXmlDocument &stDoc,int Flag/*层级*/,mapTaskInfoCfg &mpTaskInfo) { TiXmlElement* pNowElement = stDoc.RootElement(); //root节点 //循环Flag次,以指向需要的节点层级 while(Flag--){ pNowElement = pNowElement->FirstChildElement(); //指向下一个 } while ( pNowElement ) { TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性 TASK_INFO_DETAIL Config; ZeroMemory(&Config, sizeof(TASK_INFO_DETAIL)); while ( attributeOfStudent ) { switch(string(attributeOfStudent->Name())) { case GROWN_BAGS_CFG_XML_ID: { //数字直接赋值 Config.m_iID= atoi(attributeOfStudent->Value()); break; } case GROWN_BAGS_CFG_XML_ID: { //字符串直接拷贝 memcpy(Config.m_strName ,attributeOfStudent->Value(),strlen(attributeOfStudent->Value())+1); break; } default: break; } std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;//打印当前的数据看看 attributeOfStudent = attributeOfStudent->Next();//指向下一个元素 } mpTaskInfo[Config.m_iID] = Config; pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点 } } //更新xml节点元素 void CLocalConfig::UpdateAttributeByTaskXml(TiXmlDocument &stDoc,int Flag,map<int,int> &mpTaskUpdate) { TiXmlElement* pNowElement = stDoc.RootElement(); //root //循环Flag次,以指向需要的节点层级 while(Flag--){ pNowElement = pNowElement->FirstChildElement(); //指向下一个 } while ( pNowElement ) { TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性 while ( attributeOfStudent ) { if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_ID) { //看看是不是这个ID int iTaskId= atoi(attributeOfStudent->Value()); map<int,int>::iterator itr = mpTaskUpdate.find(iTaskId); if(itr == mpTaskUpdate.end()) { break; } } else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_MODIFY) { attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了 } else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_NEW) { attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了 } else { } attributeOfStudent = attributeOfStudent->Next();//指向下一个元素 } pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点 } }
时间: 2024-09-29 05:31:05