開發軟體時經常需要把一些東西做成可配置的,於是就需要用到配置檔案,以前多是用ini檔案,然後自己寫個類來解析。現在有了XML,許多應用軟體就喜歡把配置檔案做成XML格式。但是如果我們的程式本身很小,為了讀取個配置檔案卻去用Xerces XML之類的庫,恐怕會得不償失。那麼用TinyXML吧,它很小,只有六個檔案,加到專案中就可以開始我們的配置檔案之旅了。
前些時候我恰好就用TinyXML寫了一個比較通用的配置檔案類,基本可以適應大部分的場合,不過配置檔案只支援兩層結構,如果需要支援多層巢狀結構,那還需要稍加擴充套件一下。
從下面的原始碼中,你也可以看到怎麼去使用TinyXML,也算是它的一個應用例子了。
/*
** FileName: config.h
** Author: hansen
** Date: May 11, 2007
** Comment: 配置檔案類,主要用來讀取xml配置檔案中的一些配置資訊
*/
#ifndef _CONFIG
#define _CONFIG
#include <string>
#include "tinyxml.h"
using namespace std;
class CConfig
{
public:
explicit CConfig(const char* xmlFileName)
:mXmlConfigFile(xmlFileName),mRootElem(0)
{
//載入配置檔案
mXmlConfigFile.LoadFile();
//得到配置檔案的根結點
mRootElem=mXmlConfigFile.RootElement();
}
public:
//得到nodeName結點的值
string GetValue(const string& nodeName);
private:
//禁止預設建構函式被呼叫
CMmsConfig();
private:
TiXmlDocument mXmlConfigFile;
TiXmlElement* mRootElem;
};
#endif
/*
** FileName: config.cpp
** Author: hansen
** Date: May 11, 2007
** Comment:
*/
#include "config.h"
#include <iostream>
string CConfig::GetValue(const string& nodeName)
{
if(!mRootElem)
{
cout<<"讀取根結點出錯"<<endl;
return "";
}
TiXmlElement* pElem=mRootElem->FirstChildElement(nodeName.c_str());
if(!pElem)
{
cout<<"讀取"<<nodeName<<"結點出錯"<<endl;
return "";
}
return pElem->GetText();
}
int main()
{
CConfig xmlConfig("XmlConfig.xml");
//獲取Author的值
string author = xmlConfig.GetValue("Author");
cout<<"Author:"<<author<<endl;
//獲取Site的值
string site = xmlConfig.GetValue("Site");
cout<<"Site:"<<site<<endl;
//獲取Desc的值
string desc = xmlConfig.GetValue("Desc");
cout<<"Desc:"<<desc<<endl;
return 0;
}
假設配置檔案是這樣的:
<!– XmlConfig.xml –>
<?xml version="1.0" encoding="GB2312" ?>
<Config>
<Author>hansen</Author>
<Site>www.hansencode.cn</Site>
<Desc>這是個測試程式</Desc>
</Config>
怎麼使用上面的配置類來讀取XmlConfig.xml檔案中的配置呢?很簡單:
int main()
{
CConfig xmlConfig("XmlConfig.xml");
//獲取Author的值
string author = xmlConfig.GetValue("Author");
cout<<"Author:"<<author<<endl;
//獲取Site的值
string site = xmlConfig.GetValue("Site");
cout<<"Site:"<<site<<endl;
//獲取Desc的值
string desc = xmlConfig.GetValue("Desc");
cout<<"Desc:"<<desc<<endl;
return 0;
}
執行結果如下:
D:\config\Debug>config.exe
Author:hansen
Site:www.hansencode.cn
Desc:這是個測試程式