标签:
在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的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 = 0; //获取全部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)*255); fileName = strPath.GetAt(i).GetBuffer(); configXmlFile.SaveFile(fileName);
注意最后的savefile,保证自己的应用程序具有写权限,某些平台下需要打开uac控制,应用程序界面如下
老规矩上工程代码
http://download.csdn.net/detail/dengrengong/8610017
标签:
原文地址:http://www.cnblogs.com/dengxiaojun/p/4439443.html