boost库property_tree示例

本文详细介绍了Boost库中的property_tree模块,通过实例展示了如何使用该模块进行XML、JSON和INI文件的读写操作,深入理解其API用法和数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文本 Log.json

{
   "Logger":
   {
      "CoreTools": 1,
      "Framework": 1,
      "Mathematics": 1,
      "Rendering": 1,
      "Imagics": 1,
      "Physics": 1,
       "System": 1,
       "Network": 1,
       "SoundEffect": 1,
       "ArtificialIntellegence": 1,
       "AssistTools": 1,
        "User": 1
   },


   "Appender":
   {
      "Console":      
      {
          "Flags": 7,
          "Level": 1
      },       
      
   "File":
      [
         {
           "Directory": "Log/", 
           "FileName": "CoreTools.log",
           "Flags": 7, 
            "Level": 1,
            "MaxFileSize":1000000,
            "Backup": true}     
      ]
   }
}

头文件

#include "AppenderManage.h"


#include <boost/property_tree/ptree.hpp>
#include <string>


namespace CoreTools
{
       class AnalysisAppenderManage 
      {
      public:
          typedef AnalysisAppenderManage ClassType;


     public:
          explicit AnalysisAppenderManage(const std::string& fileName);


#ifdef _DEBUG
          bool IsValid() const;
#endif // _DEBUG 


           AppenderManage GetAppenderManage() const;


private:
void Analysis();
void AnalysisJson();
void AnalysisLogger();
void InsertLogger(const std::string& logLevelTypeData,
                     LogFilterType filterType);
void AnalysisAppender();
void AnalysisConsoleAppender();
void AnalysisFileAppender();
void InsertAppender(const boost::property_tree::ptree& fileTreeData);


private:
AppenderManage m_AppenderManage;
std::string m_FileName;
boost::property_tree::ptree m_MainTree;
boost::property_tree::ptree m_AppenderTree;
};
}

源文件

#include "CoreTools/Exception/CoreToolsException.h"
#include "AnalysisAppenderManage.h"
#include "Logger.h"
#include "Appender.h"
#include "LogFilterManage.h"
#include "CoreTools/CharacterString/StringConversion.h"
#include "CoreTools/Macro/LogMacro.h"
#include "CoreTools/Macro/ClassInvariantMacro.h"
#include "CoreTools/ClassInvariant/CoreToolsClassInvariant.h"


#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>


#ifdef _MSC_VER
 #pragma warning(disable:4512)
#endif // _MSC_VER


#include <boost/property_tree/json_parser.hpp>


using std::string;
using boost::lexical_cast;
using boost::bad_lexical_cast;
using boost::property_tree::ptree;
using boost::property_tree::ptree_error;


CoreTools::AnalysisAppenderManage
::AnalysisAppenderManage( const string& fileName )
:m_AppenderManage(),m_FileName(fileName),
m_MainTree(),m_AppenderTree()
{
Analysis();


SELF_CLASS_IS_VALID;
}


// private
void CoreTools::AnalysisAppenderManage
::Analysis()
{
AnalysisJson();
AnalysisLogger();
AnalysisAppender();
}


// private
void CoreTools::AnalysisAppenderManage
::AnalysisJson()
{
read_json(m_FileName,m_MainTree);
}


// private
void CoreTools::AnalysisAppenderManage
::AnalysisLogger()
{
BOOST_FOREACH(ptree::value_type& loggerPtree,m_MainTree.get_child("Logger"))
{
LogFilterType filterType = 
LogFilterManage::GetLogFilterType(loggerPtree.first);
if(filterType == MaxLogFilter)
continue;


InsertLogger(loggerPtree.second.data(), filterType);
}
}


// private
void CoreTools::AnalysisAppenderManage
::InsertLogger(const string& logLevelTypeData, 
              LogFilterType filterType )
{
try
{
LogLevelType levelType = 
LogLevelType(lexical_cast<int>(logLevelTypeData));


if(LogLevelDisabled <= levelType && levelType < MaxLogLevels)
m_AppenderManage.InsertLogger(Logger(filterType,levelType));
}
catch(bad_lexical_cast& error)
{
LOG_SINGLETON_APPENDER(Warn,CoreTools)
<< error.what()
<< LogAppenderIOManageSignTriggerAssert;
}
}


// private
void CoreTools::AnalysisAppenderManage
::AnalysisAppender()
{
m_AppenderTree = m_MainTree.get_child("Appender");


try
{
AnalysisConsoleAppender();
}
catch(Error& error)
{
LOG_SINGLETON_APPENDER(Warn,CoreTools)
<< error
<< LogAppenderIOManageSignTriggerAssert;
}

AnalysisFileAppender();
}


// private
void CoreTools::AnalysisAppenderManage
::AnalysisConsoleAppender()
{
ptree consoleTree = m_AppenderTree.get_child("Console");


AppenderFlags appenderFlags = AppenderFlags(consoleTree.get("Flags",0));
LogLevelType logLevelType = LogLevelType(consoleTree.get("Level",0));


if(LogLevelDisabled <= logLevelType && logLevelType < MaxLogLevels)
{
Appender appender(appenderFlags,logLevelType);
m_AppenderManage.InsertAppender(TEXT("Console"),appender);
} 
}


// private
void CoreTools::AnalysisAppenderManage
::AnalysisFileAppender()
{
BOOST_FOREACH(ptree::value_type& fileTree,m_AppenderTree.get_child("File"))
{
try
{
InsertAppender(fileTree.second);
}
catch(Error& error)
{
LOG_SINGLETON_APPENDER(Warn,CoreTools)
<< error
<< LogAppenderIOManageSignTriggerAssert;
} 
}
}


// private
void CoreTools::AnalysisAppenderManage
::InsertAppender(const ptree& fileTreeData)
{
string directory = fileTreeData.get("Directory","");
string fileName = fileTreeData.get("FileName","");
AppenderFlags flags = AppenderFlags(fileTreeData.get("Flags",0));
LogLevelType level = LogLevelType(fileTreeData.get("Level",0));
unsigned maxFileSize = fileTreeData.get("MaxFileSize",0);
bool backup = fileTreeData.get("Backup",false);


if(!fileName.empty() && 
  LogLevelDisabled <= level && 
  level < MaxLogLevels)
{
STRING directoryConversion
= StringConversion::MultiByteConversionStandard(directory);


STRING fileNameConversion
= StringConversion::MultiByteConversionStandard(fileName);


Appender appender(directoryConversion,fileNameConversion,
             flags,level,maxFileSize,backup);
m_AppenderManage.InsertAppender(fileNameConversion,appender);
} 
}


#ifdef _DEBUG
bool CoreTools::AnalysisAppenderManage
::IsValid() const
{
if(m_AppenderManage.IsValid())
   return true;
else
return false;
}
#endif // _DEBUG


CoreTools::AppenderManage CoreTools::AnalysisAppenderManage
::GetAppenderManage() const
{
CLASS_IS_VALID;


return m_AppenderManage;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值