在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的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. 【威佐夫博奕】 betty定理 poj 1067

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  2. 编译使用tinyxml

    环境: win7 32位旗舰版,VS2010,tinyxml_2_6_2版本 1.下载tinyxml,并解压到tinyxml文件夹下 2.生成动态链接库 原生的Tinyxml只支持静态库(没有在.h文 ...

  3. ActiveX控件在IE中不响应Backspace消息

    1.操作输入法需要导入: #include <imm.h> #pragma comment(lib, "imm32") 2.定义变量: //键盘钩子句柄 HHOOK g ...

  4. jquery的校验规则的方法

    //validate 选项*********************************************************** $("form").validat ...

  5. Hibernate 乐观锁(Optimistic Locking)

    1.hibernate基于数据版本(Version)记录机制实现.为数据增加一个版本标识,一般是通过为数据库表增加一个"version"字段来实现. 读取出数据时,将此版本号一同读 ...

  6. HDU 5741 Helter Skelter

    离线处理+扫描线.题意很容易转化:若干个矩形形成并集,询问一些点是否在并集中? 官方题解不是这样做的....那种做法效率更高,暂时还不会.我这样是4500ms G++过的,C++TLE...... 区 ...

  7. Servlet程序开发-Helloworld

    D:\Workspace\WEB-INF\classes下新建HelloServlet.java文件: package org.lxh.servletdemo ; import java.io.* ; ...

  8. Codeforces Round #272 (Div. 1) B 构造 math

    http://www.codeforces.com/contest/477/problem/C 题目大意:给你n个集合,每个集合里面有四个数字,他们的gcd是k,输出符合条件的集合中m,m为集合中最大 ...

  9. ecb gud

    mx gdb不好用,好像是因为用了一个dedicated window,改用mx gud-gdb,好用. http://stackoverflow.com/questions/13560933/how ...

  10. String转float

    float mTotalhour = Float.parseFloat(mTotalHourEt.getText().toString().trim());