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