tinyxml2库的使用--MFC工程

    在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。