用xml替代ini的类实现

前端之家收集整理的这篇文章主要介绍了用xml替代ini的类实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如果有一个任务,需要连续的读写ini,因为WritePrivateProfileString GetPrivateProfileString 每次都需要读写ini文件,很浪费时间。

经过测量,如果条目较多(>= 700),时间有700MS以上.


写了一个类,用xml模拟ini的存储样式,不用每次都读写文件文件的保存时机由自己控制,效率高很多.

工程下载 : src_xmlIni.rar

// xmlIni.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "MyXmlIni.h"

int _tmain(int argc,_TCHAR* argv[])
{
    CMyXmlIni   ini;
    BOOL        bRc = FALSE;

    std::wstring strKey1Value = L"";
    std::wstring strKey2Value = L"";
    std::wstring strKeyNValue = L"";

    ini.SetIniPathName(L"d:\\myIni.xml");
    ini.WriteToIni(L"1",L"2",L"3");
    ini.SaveXml(); ///< 可以自己选择保存文件的时机

    bRc = ini.ReadFromIni(strKey1Value,strKey2Value,strKeyNValue);
    if (bRc)
    {
        _tprintf(L"strKey1Value = %s\r\n",strKey1Value.c_str());
        _tprintf(L"strKey2Value = %s\r\n",strKey2Value.c_str());
        _tprintf(L"strKeyNValue = %s\r\n",strKeyNValue.c_str());
    }
    else
    {
        _tprintf(L"read ini Failed\r\n");
    }

    /** xml文件内容
    <ini>
    <MyIniSection>
    <MyIniKey1>1</MyIniKey1>
    <MyIniKey2>2</MyIniKey2>
    <MyIniKey3>3</MyIniKey3>
    </MyIniSection>
    </ini>
    */

    /** run result
    strKey1Value = 1
    strKey2Value = 2
    strKeyNValue = 3
    */

    getchar();
	return 0;
}


/// @file       MyXmlIni.h
/// @brief      用Xml模拟Ini那种Section/Key的文件读写过程,///             应对iniApi每次都读写文件引起的性能瓶颈

#ifndef __MY_XML_INI_H__
#define __MY_XML_INI_H__

#include "stdafx.h"
#include "XmlIniBase.h"

#define INI_SECTION     L"MyIniSection"
#define INI_KEY_1       L"MyIniKey1"
#define INI_KEY_2       L"MyIniKey2"
#define INI_KEY_N       L"MyIniKey3"

class CMyXmlIni : public CXmlIniBase
{
public:
    CMyXmlIni();
    virtual ~CMyXmlIni();

    BOOL ReadFromIni(
        std::wstring& strKey1Value,std::wstring& strKey2Value,std::wstring& strKey3Value);

    BOOL WriteToIni(
        const WCHAR* pcKey1Value,const WCHAR* pcKey2Value,const WCHAR* pcKeyNValue);
};

#endif // #ifndef __MY_XML_INI_H__

/// @file       XmlIniBase.h
/// @brief      用Xml模拟Ini那种Section/Key的文件读写过程,///             应对iniApi每次都读写文件引起的性能瓶颈

#ifndef __XML_INI_BASE_H__
#define __XML_INI_BASE_H__

#include "stdafx.h"
#include "Markup.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) \
    if (NULL != (p)) \
        { \
            delete (p); \
            (p) = NULL; \
        }
#endif

class CXmlIniBase
{
public:
    CXmlIniBase();
    virtual ~CXmlIniBase();

    void SetIniPathName(const WCHAR* pcIniPathName);

    BOOL SetDataToXml(
        const WCHAR* pcSection,const WCHAR* pcKey,const WCHAR* pcValue);

    BOOL GetDataFromXml(
        const WCHAR* pcSection,std::wstring & strValue);

    BOOL FreeXml();
    BOOL SaveXml();

private:

    BOOL IntoRoot();

    void CXmlIniBase::SetXmlObj(CMarkup * pObj);
    CMarkup * CXmlIniBase::GetXmlObj();

private:
    CMarkup * m_pXml;
    std::wstring m_strXmlFilePathName;
};

#endif // #ifndef __XML_INI_BASE_H__

/// @file       XmlIniBase.cpp
/// @brief  

#include "stdafx.h"
#include "MyXmlIni.h"

CMyXmlIni::CMyXmlIni()
{

}

CMyXmlIni::~CMyXmlIni()
{
}

BOOL CMyXmlIni::ReadFromIni(
    std::wstring& strKey1Value,std::wstring& strKey3Value)
{
    BOOL            bRc =      FALSE;
    int             iTemp = 0;
    std::wstring    strTemp = L"";

    bRc = GetDataFromXml(INI_SECTION,INI_KEY_1,strKey1Value);
    if (!bRc)
        return bRc;

    bRc = GetDataFromXml(INI_SECTION,INI_KEY_2,strKey2Value);
    if (!bRc)
        return bRc;

    bRc = GetDataFromXml(INI_SECTION,INI_KEY_N,strKey3Value);
    if (!bRc)
        return bRc;

    return TRUE;
}

BOOL CMyXmlIni::WriteToIni(
    const WCHAR* pcKey1Value,const WCHAR* pcKeyNValue)
{
    BOOL            bRc =      FALSE;
    int             iTemp = 0;
    std::wstring    strTemp = L"";

    bRc = SetDataToXml(INI_SECTION,pcKey1Value);
    _ASSERT(bRc);

    bRc = SetDataToXml(INI_SECTION,pcKey2Value);
    _ASSERT(bRc);

    bRc = SetDataToXml(INI_SECTION,pcKeyNValue);
    _ASSERT(bRc);

    return bRc;
}



/// @file       XmlIniBase.cpp
/// @brief  

#include "stdafx.h"
#include "XmlIniBase.h"

CXmlIniBase::CXmlIniBase() :
    m_pXml(NULL),m_strXmlFilePathName(L"")
{

}

CXmlIniBase::~CXmlIniBase()
{
    SAFE_DELETE(m_pXml);
}

void CXmlIniBase::SetXmlObj(CMarkup* pObj)
{
    m_pXml = pObj;
}

CMarkup* CXmlIniBase::GetXmlObj()
{
    return m_pXml;
}

BOOL CXmlIniBase::SaveXml()
{
    bool    bRc = false;

    _ASSERT(!m_strXmlFilePathName.empty());
    bRc = m_pXml->Save(m_strXmlFilePathName.c_str());
    _ASSERT(true == bRc);

    return (true == bRc);
}

BOOL CXmlIniBase::IntoRoot()
{
    BOOL    bRc = FALSE;
    const WCHAR * const pcXmlRootName = L"ini";
    CMarkup* pXml = GetXmlObj();
    _ASSERT(NULL != pXml);

    pXml->ResetPos(); ///< !
    bRc = pXml->FindElem(pcXmlRootName); ///< xml根节点名称 = ini
    if (!bRc)
    {
        // create one
        bRc = pXml->AddElem(pcXmlRootName);
        _ASSERT(bRc);
    }

    _ASSERT(bRc);
    bRc = pXml->IntoElem();
    _ASSERT(bRc);

    return bRc;
}

void CXmlIniBase::SetIniPathName(const WCHAR* pcIniPathName)
{
    _ASSERT(NULL != pcIniPathName);
    CMarkup* pXml = NULL;

    m_strXmlFilePathName = pcIniPathName;
    pXml = GetXmlObj();
    if (NULL != pXml)
    {
        FreeXml();
    }

    pXml = new CMarkup;
    _ASSERT(NULL != pXml);

    SetXmlObj(pXml);
    if (!GetXmlObj()->Load(pcIniPathName))
    {
        SaveXml();
    }
}

BOOL CXmlIniBase::SetDataToXml(
    const WCHAR* pcSection,const WCHAR* pcValue)
{
    BOOL        bRc = false;
    CMarkup*    pXml = GetXmlObj();
    _ASSERT(NULL != pXml);

    _ASSERT(NULL != pcSection);
    _ASSERT(NULL != pcKey);
    _ASSERT(NULL != pcValue);

    bRc = IntoRoot();
    _ASSERT(bRc);

    bRc = pXml->FindElem(pcSection);
    if (!bRc)
    {
        // create one
        bRc = pXml->AddElem(pcSection);
        _ASSERT(bRc);
    }

    pXml->IntoElem(); ///< => pcSection
    bRc = pXml->FindElem(pcKey);
    if (!bRc)
    {
        // create one
        bRc = pXml->AddElem(pcKey);
        _ASSERT(bRc);
    }

    if (bRc)
    {
        bRc = pXml->SetData((NULL != pcValue) ? pcValue : L"");
        _ASSERT(bRc);
    }

    pXml->OutOfElem(); ///< <= pcSection

    return bRc;
}

BOOL CXmlIniBase::GetDataFromXml(
    const WCHAR* pcSection,std::wstring & strValue)
{
    BOOL        bRc = false;
    CMarkup*    pXml = GetXmlObj();
    _ASSERT(NULL != pXml);
    if (NULL == pXml)
        goto END_GetDataFromXml;

    _ASSERT(NULL != pcSection);
    _ASSERT(NULL != pcKey);

    bRc = IntoRoot();
    _ASSERT(bRc);

    bRc = pXml->FindElem(pcSection);
    if (!bRc)
    {
        goto END_GetDataFromXml;
    }

    pXml->IntoElem(); ///< => pcSection
    bRc = pXml->FindElem(pcKey);
    if (!bRc)
    {
        goto END_GetDataFromXml;
    }

    strValue = pXml->GetData();
    pXml->OutOfElem(); ///< <= pcSection

END_GetDataFromXml:
    return bRc;
}

BOOL CXmlIniBase::FreeXml()
{
    SAFE_DELETE(m_pXml);
    return TRUE;
}

猜你在找的XML相关文章