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

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

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

 //开始热更
void CLocalConfig::HotUpdateXmlCfg(string filePath)
{
// 定义一个TiXmlDocument类变量
TiXmlDocument Doc;
mapTaskInfoCfg mpTaskInfoConfig;
map<int,int> mpInsert;
if(!Doc.LoadFile(filePath.c_str()))
{
return;
} GetAttributeByTaskXml(Doc,,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() != )
{
//更新刚刚热更成功的xml表
UpdateAttributeByTaskXml(Doc,,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())+);
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,代表已经更新了
}
else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_NEW)
{
attributeOfStudent->SetValue("");//设置属性为0,代表已经更新了
}
else
{ }
attributeOfStudent = attributeOfStudent->Next();//指向下一个元素
}
pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点
}
}

利用TinyXml进行数据库的热更新的更多相关文章

  1. unity游戏热更新

    链接:https://pan.baidu.com/s/1ggWP0OF 第 1 章 : 热更新技术学习介绍 课时1:101-热更新技术学习介绍 11:55 什么是热更新? 举例来说 游戏上线后,玩家下 ...

  2. 热更新(一) 之Lua语法的学习

    热更新 如热更新果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好).热更新可以在不重新下载客户端的情况下,更新游戏的内容 ...

  3. Unity热更新技术整理

    一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...

  4. Spring Boot 利用 nginx 实现生产环境的伪热更新

    当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...

  5. Python 软件热更新

    Python 软件热更新 本篇文章涉及技术知识如下: Redis threading 多线程 PyQt5 importlib 热更新 场景 咱们在平时运行一些长时间都会一直运行的软件(如:某些云同步软 ...

  6. MySQL数据库双机热备------主-主备份配置

    MySQL数据库双机热备------主-主备份配置 实验环境: 主1数据库 192.168.1.1 centos6.5 x86_64 +MySQL5.5.35 主2数据库192.168.1.2  Wi ...

  7. 谁偷了我的热更新?Mono,JIT,iOS

    前言 由于匹夫本人是做游戏开发工作的,所以平时也会加一些玩家的群.而一些困扰玩家的问题,同样也困扰着我们这些手机游戏开发者.这不最近匹夫看自己加的一些群,常常会有人问为啥这个游戏一更新就要重新下载,而 ...

  8. JSPatch热更新的利器.

    如果用一句话来描述JSPatch,就是利用系统自带的JavaScriptCore.framework配合RunTime机制,进行实时的代码下载与运行.. 而且使用也很简单,启动,加载JS,运行... ...

  9. IOS热更新-JSPatch实现原理+Patch现场恢复

    关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...

随机推荐

  1. PowerShell管道入门,看看你都会不(管道例子大全)

    PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ...

  2. JAVAEE学习——struts2_02:结果跳转方式、访问servletAPI方式、获得参数以及封装和练习:添加客户

    一.结果跳转方式 <action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" m ...

  3. PHP 获取系统信息,PHP 获取服务器详细信息

    获取系统类型及版本号:    php_uname()                                   (例:Windows NT COMPUTER 5.1 build 2600)只 ...

  4. 用hmmlearn学习隐马尔科夫模型HMM

    在之前的HMM系列中,我们对隐马尔科夫模型HMM的原理以及三个问题的求解方法做了总结.本文我们就从实践的角度用Python的hmmlearn库来学习HMM的使用.关于hmmlearn的更多资料在官方文 ...

  5. centOS下服务启动

    nginx应该在mongodb之后启动,也可以通过chkconfig <服务名> on将服务设置为开机自启动.具体命令如下 service mysql start service memc ...

  6. 为什么使用bootstrap在一个页面同时做两个轮播效果时,只有第一个有效??

    我们都知道使用bootstrap做轮播效果非常快,但是有时候一个页面会需要两个轮播:但这个时候再次使用bootstrap做轮播效果时就会失效:原因在于bootstrap的Carousel问题,只要修改 ...

  7. Lucence_Curd

    设置Field的类型 new StringField 不分词(id,身份证号,电话...) new StoredField 不分词(链接) new TextField 分词(文本) new Fload ...

  8. html与xhtml有什么区别?

    HTML与XHTML之间的差别,主要分为功能上的差别和书写习惯的差别两方面. 关于功能上的差别,主要是XHTML可兼容各大浏览器.手机以及PDA,并且浏览器也能快速正确地编译网页. 由于XHTML的语 ...

  9. maven打包 bat自动化打包

    maven打包,首先cd到项目根目录,如果想跳过测试阶段,可用:mvn package -DskipTests bat命令,说明start是打开文件夹的意思:e: cd E:\workspace\it ...

  10. JS面向对象一

    面向对象分为三大类 封装,继承,多态! 封装就是在一个函数方法中嵌套另外一个函数方法,外层函数方法返回内层函数方法里面的结果,其中内层函数要调用外层函数定义的局部变量 每个函数方法就是一个局部作用域, ...