#include "stdafx.h"
#include "tinyxml.h"//去网上下载tinyxml等5个有关的头文件和源文件
#include "tinystr.h"
class CXmlOper
{
public:
CXmlOper(CString FileName);//FileName:是配置文件文件名,初始化函数可看到是默认保存路径
~CXmlOper();
CString ReadNodeValue(CString NodeName);//NodeName是XML标示节点名字(<str><\str>)
//自然返回的是(<str><\str>)里面的信息
int WriteNodeValue(CString NodeName,CString Value);
int savefile();
private:
TiXmlDocument* m_pDoc;//TiXmlDocument是tinyxml中的一个类
}
//================================源文件================
#include "stdafx.h"
#include"CXmlOper.h"
CXmlOper::CXmlOper(CString FileName)
{
m_pDoc= new TiXmlDocument(".\\"+FileName);//指针指向FileNameXML文件,该文件必须事先存在,配置好!。。。
}
CString CXmlOper::ReadNodeValue(CString NodeName)
{
TiXmlElement* root = m_pDoc->RootElement();// root 获取根节点
TiXmlElement* node = root->FirstChildElement();//获取根节点下第一个子节点的名字
while(node)//这里以两层的XML节点为例,所以两个while判断,具体多少层,按具体情况而定
{
TiXmlElement* subnode = node->FirstChildElement();
while(subnode)
{
if(subnode->Value()==NodeName)
return subnode->GetText();//返回
subnode = subnode->NextSiblingElement();
}
node = node->NextSiblingElement();
}
return "";
}
//====================================================
int CXmlOper::WriteNodeValue(CString NodeName,CString Value)//此函数只写到内存m_pDoc,要想写到文件中,还需要调用保存函数
{
TiXmlElement* root = m_pDoc->RootElement();// root 获取根节点
TiXmlElement* node = root->FirstChildElement();//获取根节点下第一个子节点的名字
while(node)//这里以两层的XML节点为例,所以两个while判断,具体多少层,按具体情况而定
{
TiXmlElement* subnode = node->FirstChildElement();
while(subnode)
{
if(subnode->Value()==NodeName)
{
TiXmlText* m_text = new TiXmlText(Value);
subnode->clear();//先清掉原节点内容,再给副新值
subnode->LinkEndChild(m_text);
return 0;
}
subnode = subnode->NextSiblingElement();
}
node = node->NextSiblingElement();
}
return -1;
}
//===================
int CXmlOper::savefile()
{
if(m_pDoc)
m_pDoc->SaveFile();
else
return -1;
return 0;
}
//========================================================简单应用该类================================================================
1.#define ConfigFile "DBTool.xml"//宏定义配置文件名
2. CXmlOper* m_xml;//在class CDBToolDlg中似有声明
void GetNodeValue();//用于读取XML默认配置,并初始化控件
3.窗口初始化时 m_xml = new CXmlOper(ConfigFile);
GetNodeValue();
4.void CDBToolDlg::On,。。()//保存所有配置信息(以下简单举例)
{
m_xml = new CXmlOper(ConfigFile);//其实就是打开相应的配置文件
updata();//这是自己写的一个函数,目的使类的成员变量和界面上的保持一致
//====================以下是把ip写入,有点点不同===============
BYTE nFileld0,nFileld1,nFileld2,nFileld3;
ip_ctr.GetAddress(nFileld0,nFileld1,nFileld2,nFileld3);//CIPAddressCtrl ip_ctr(这是ip控件的控制变量)
CString ip;
ip.Format("%d.%d.%d.%d",nFileld0,nFileld1,nFileld2,nFileld3);设置字符串格式
m_xml->WriteNodeValue("IP",ip);//意思是节点IP的text是ip的字符窜
//==============================
m_xml->WriteNodeValue("port",port);
.............
m_xml->savefile();//不能漏
}
//====================================
void CDBToolDlg::GetNodeValue()
{
m_xml = new CXmlOper(ConfigFile);//其实就是打开相应的配置文
BYTE nFileld0,nFileld1,nFileld2,nFileld3;
ip_ctr.GetAddress(nFileld0,nFileld1,nFileld2,nFileld3);//CIPAddressCtrl ip_ctr(这是ip控件的控制变量)
CString ip2;
ip2.Format("%d.%d.%d.%d",nFileld0,nFileld1,nFileld2,nFileld3);设置字符串格式
ip2 = m_xml->ReadNodeValue("IP");//XML文件IP节点的内容读入ip2
this->GetDlgItem(IDC_IPADDRESS1)->SetWindowText(ip2);//这样就能设置界面上的ip为XML中的默认值了
//====================其他设置比较简单,不说了
}