一个使用tingxml解析XML配置文件的例子

配置文件如下所示:

<?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;
}

结果如下图所示
result

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值