配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Config>
<DB>
<Host>USER-20141111\www</Host>
<DBName>FFFF</DBName>
<User>sa</User>
<Password>123456</Password>
</DB>
<DownloadPath>D:\</DownloadPath>
<Timeout>3</Timeout>
</Config>
读取配置文件的函数实现如下所示:
BOOL ReadConfigFile()
{
CString g_strDbInfo[4]; // 用来保存配置信息的数组
TiXmlElement* pElmChild = NULL; // 一个指向Element的指针
CString strPath;
strPath = _T("D:\\Config.xml"); //配置文件的地址
CString strTemp;
if (!PathFileExists(strPath))
{
AfxMessageBox(_T("找不到配置文件"));
return false;
}
CStringA str;
str = strPath;
TiXmlDocument xmlDoc( str.GetBuffer() ); // 输入XML路径
str.ReleaseBuffer();
if( !xmlDoc.LoadFile() ) // 读取XML并检查是否读入正确
{
// log.error("load file(%s) error, %s", (char *)strPath.GetBuffer(), xmlDoc.ErrorDesc());
return false;
}
TiXmlElement* pElmRoot = NULL, *pElemTemp, *pElemTempson; // 根节点
pElmRoot = xmlDoc.RootElement(); // 得到根节点
if( !pElmRoot )
{
//log.error("read xml file error, can't find the `config` tag");
return false;
}
pElemTemp = pElmRoot->FirstChildElement("DB");
do
{
if ( !pElemTemp )
break;
pElemTempson = pElemTemp->FirstChildElement("Host");
if ( pElemTempson )
{
Utf8ToCString(strTemp,pElemTempson->GetText());
g_strDbInfo[0] = strTemp;
// g_strDbInfo[0] = pElemTempson->GetText();
}
pElemTempson = pElemTemp->FirstChildElement("User");
if ( pElemTempson )
{
Utf8ToCString(strTemp,pElemTempson->GetText());
g_strDbInfo[2] = strTemp;
}
pElemTempson = pElemTemp->FirstChildElement("Password");
if ( pElemTempson )
{
Utf8ToCString(strTemp,pElemTempson->GetText());
g_strDbInfo[3] = strTemp;
}
pElemTempson = pElemTemp->FirstChildElement("DBName");
if ( pElemTempson )
{
Utf8ToCString(strTemp,pElemTempson->GetText());
g_strDbInfo[1] = strTemp;
}
pElemTempson = pElemTemp->FirstChildElement("DBName");
if ( pElemTempson )
{
Utf8ToCString(strTemp,pElemTempson->GetText());
g_strDbInfo[1] = strTemp;
}
} while (false);
return true;
}
其中转码函数:Utf8ToCString 的实现如下所示:
BOOL Utf8ToCString( CString& cstr, const char* utf8Str )
{
if (utf8Str ==NULL)
{
cstr.Empty();
return true;
}
size_t utf8StrLen = strlen(utf8Str);
if( utf8StrLen == 0 )
{
cstr.Empty();
return true;
}
#ifdef UNICODE
// cstr = utf8Str;
LPTSTR ptr = cstr.GetBuffer(utf8StrLen);
ZeroMemory(ptr,utf8StrLen);
// CString is UNICODE string so we decode
int newLen = MultiByteToWideChar(CP_UTF8, 0, utf8Str, utf8StrLen, ptr, utf8StrLen );
if( !newLen )
{
cstr.ReleaseBuffer(0);
return false;
}
cstr.ReleaseBuffer(utf8StrLen);
cstr = cstr.Left(newLen);
#else
WCHAR* buf = new WCHAR[utf8StrLen*2+2];
ZeroMemory(buf,utf8StrLen*2+2);
int newLen = MultiByteToWideChar(CP_UTF8, 0, utf8Str, utf8StrLen, buf, utf8StrLen);
if(!newLen)
{
delete [] buf;
return false;
}
cstr = buf;
delete [] buf;
#endif
return true;
}
结果如下图所示