在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库,c++格式的,也就是我们今天说的tinyxml2

tinyxml2主要有两个文件,如下

使用的时候把他门加入自己的应用程序,如下

然后在相应的头文件中导入该库,如下

#include "tinyxml2.h"
using namespace tinyxml2;

然后我定义了一种xml目录结构,如下

<?xml version="1.0" encoding ="utf-8"?>
<messages>
<button_messages>
<button>
<name>help</name>
<promptmessage>显示帮助信息</promptmessage>
<serialSendString>help</serialSendString>
</button>
<button>
<name>list</name>
<promptmessage>显示命令列表</promptmessage>
<serialSendString>list</serialSendString>
</button>

使用该库加载这个文件的时候,先要装载文件,然后轮询元素,如下

//加载文件
XMLError load = configXmlFile.LoadFile(fileName);
if(load != XML_SUCCESS)
{
MessageBox("文件加载失败","提示",MB_OK);
configFileLoadOk = false;
return;
}
//文件加载成功
XMLElement* pElement;
XMLElement* hRoot;
//加载根节点
hRoot = configXmlFile.RootElement();
if(!hRoot)
{
MessageBox("根节点错误","提示",MB_OK);
return;
}

首先加载根节点,然后依次轮询子节点

//获取全部button数据
do
{
//获取数据
nameString = pElement->FirstChildElement("name")->GetText();
promptMessage = pElement->FirstChildElement("promptmessage")->GetText();
serialSendString = pElement->FirstChildElement("serialSendString")->GetText();
if(nameString)
buttonName->Add(nameString);
buttonPromptmessage->Add(promptMessage);
buttonSerialSendString->Add(serialSendString);
buttonIndexCount++; pElement = pElement->NextSiblingElement();//切换到下一个子元素
} while (pElement);

这样就可以将xml文件元素加载到应用程序中,接下来是修改元素,主要是讲get方法换成了set方法,如下

XMLElement* pElement;
XMLElement* hRoot;
//加载根节点
hRoot = configXmlFile.RootElement();
if(!hRoot)
{
MessageBox("根节点错误","提示",MB_OK);
return;
}
//加载快捷按键信息
pElement = hRoot->FirstChildElement("button_messages")->FirstChildElement("button");//寻找一个子元素
buttonIndexCount = ;
//获取全部button数据
do
{
pElement->FirstChildElement("name")->SetText(buttonName->GetAt(buttonIndexCount));
pElement->FirstChildElement("promptmessage")->SetText(buttonPromptmessage->GetAt(buttonIndexCount));
pElement->FirstChildElement("serialSendString")->SetText(buttonSerialSendString->GetAt(buttonIndexCount));
buttonIndexCount++; pElement = pElement->NextSiblingElement();//切换到下一个子元素
} while (pElement);
int i = ((CComboBox*)(GetDlgItem(IDC_COMBO_CONFIG_FILE_ITEM)))->GetCurSel();
char* fileName = (char*)malloc(sizeof(char)*);
fileName = strPath.GetAt(i).GetBuffer();
configXmlFile.SaveFile(fileName);

注意最后的savefile,保证自己的应用程序具有写权限,某些平台下需要打开uac控制,应用程序界面如下

老规矩上工程代码

http://download.csdn.net/detail/dengrengong/8610017

tinyxml2库的使用--MFC工程的更多相关文章

  1. c++MFC工程修改在共享DLL中使用MFC为使用标准Windows库的解决办法

    由于创建MFC工程时,默认是在共享DLL中使用MFC,如果将此选项改成使用标准Windows库,会报如下错误 c:\program files\microsoft visual studio 9.0\ ...

  2. 非MFC工程中使用MFC库

    目录(?)[-] 需求说明 常见问题 问题分析 参考解决方法 我的解决方案 Stdafxh的原理   需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console A ...

  3. 在共享DLL中使用MFC 和在静态库中使用MFC的区别

    使用VS2008,在项目属性中有一项MFC的使用,有三种设置: 1.使用标准Windows库 2.在共享DLL中使用MFC 3.在静态库中使用MFC          第一种顾名思义.        ...

  4. MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC(转)

    原文转自 https://blog.csdn.net/albertsh/article/details/52838419 1.使用标准Windows库 使用WINDOWS SDK API库,不使用MF ...

  5. 使用tinyxml2库解析xml

    tinyxml2简介 tinyxml2是c++编写的轻量级的xml解析器,而且是开放源代码的,在一些开源的游戏引擎中用的比较多.源码托管在github上. 源码地址:https://github.co ...

  6. [MFC] VS2013版本MFC工程移植到VC6.0上

    :VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本 ...

  7. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  8. 新建一个vs2010的MFC工程

    1.在新建mfc工程时Visual C++下的MFC MFC ActiveX Control用来生成MFC ActiveX控件程序 MFC Application用来生成MFC应用程序. MFC DL ...

  9. MFC工程的复制

    MFC工程的复制 [1]       在VS中新建一个同类型的MFC工程. [2]       复制.rc资源文件,用记事本打开旧工程和新工程的.rc文件,将旧工程的对应部分复制到新工程的对应部分,文 ...

随机推荐

  1. JPA 系列教程3-单向多对一

    JPA中的@ManyToOne 主要属性 - name(必需): 设定"many"方所包含的"one"方所对应的持久化类的属性名 - column(可选): 设 ...

  2. NullPointerException

    if(userName.equals("zhansan")){}   可能会报空指针异常

  3. Slow HTTP Denial of Service Attack 漏洞解决

    修改tomcat conf 下  server.xml 文件 <Connector port="8080" protocol="HTTP/1.1" con ...

  4. Swift & OC 混编 浅析

    转载自:http://www.infoq.com/cn/articles/wangyi-cartoon-swift-mixed-practice?utm_campaign=rightbar_v2&am ...

  5. 【转】对于JNI方法名,数据类型和方法签名的一些认识

    [转]对于JNI方法名,数据类型和方法签名的一些认识   之前一直用jni,但是没有考虑Java重载函数,如何在jni-C++里命名,今天看到一篇文章,讲到了类型签名. 原文链接:http://www ...

  6. 深入理解linux网络技术-P179

    上锁 net_device结构的组织一节可知,dev_base列表以及dev_name_head和dev_name_index两张hash表由dev_base_list锁保护.然而,该锁只用于对列表和 ...

  7. CentOS-Desktop版service network restart报错

    出错情况: [root@localhost]# service network restart正在关闭接口 eth0: 设备状态:3 (断开连接)                            ...

  8. 河南多校联合训练 F 不是匹配

    描述  有N个人,N个活动, 每个人只会对2个或者3个活动感兴趣,  每个活动也只有两个人或者两个活动对它兴趣,每个人参加一个  感兴趣的活动需要一天 ,且当天该活动被参加时,其他的人不能参加  如果 ...

  9. Sea.Js的运行原理(转)

    1.CMD(Common Module Definition)规范 Sea.js采用了和Node相似的CMD规范,使用require.exports和module来组织模块.但Sea.js比起Node ...

  10. 转:Web安全与Rational AppScan入门

    Web 应用的基础概念 在讨论 Web 应用安全之前,先简单介绍一下 Web 应用基础概念,这样便于理解为什么 Web 应用是脆弱的,容易受到攻击. 1. 什么是 Web 应用 Web 应用是由动态脚 ...