天天看點

boost.property_tree使用示例

下面是一個使用boost.property_tree來解析XML/INI檔案的簡單示例。

使用boost.property_tree來作為配置檔案的解析工具非常合适.

#include <iostream>

#include <string>

#include <algorithm>

#include <iterator>

#include <set>

#include <stdlib.h>

#include <unistd.h>

#include <boost/foreach.hpp>

#include <boost/noncopyable.hpp>

#include <boost/property_tree/ptree.hpp>

#include <boost/property_tree/xml_parser.hpp>

#include <boost/property_tree/ini_parser.hpp>

int main( int argc , char *argv[] )

{

std::string strConfigName( "" );

std::string strReportName( "" );

const char *szShortOptions = ":f:t:h";

while ( true )

{

const int iOption = getopt( argc , argv , szShortOptions );

if ( -1 == iOption )

{

break;

}

switch ( iOption )

{

case 'f':

{

strConfigName = optarg;

}

break;

case 't':

{

strReportName = optarg;

}

break;

case ':':

{

std::cerr << "-" << static_cast< char >( iOption ) /

<< " need option value." << std::endl;

}

break;

case 'h':

{

std::cout << "usage: " << argv[ 0 ] << " -f config [-h]"

<< std::endl;

std::cout << "-f config specify the config file name." /

<< std::endl;

std::cout << "-t report specify the target report name." /

<< std::endl;

std::cout << "-h show the help information." /

<< std::endl;

}

return EXIT_SUCCESS;

case '?':

default:

{

std::cerr << "unknown option: " << static_cast< char >( iOption ) /

<< std::endl;

}

break;

}

}

if ( ( true == strConfigName.empty() ) /

|| ( true == strReportName.empty() ) )

{

std::cout << "ERROR, usage: " << argv[ 0 ] /

<< " -f config" /

<< "/t" /

<< " -t report"

<< std::endl;

return -1;

}

/*

typedef ::boost::property_tree::ptree IniParser;

IniParser iniParser;

const std::string strNullString = "";

const int iDefaultIntValue = 0;

read_ini( strConfigName , iniParser );

const std::string strLogName = iniParser.get( "debug.log_name" , strNullString );

const int iLogLevel = iniParser.get( "debug.level" , iDefaultIntValue );

typedef std::set< std::string > ModuleSet;

ModuleSet moduleSet;

BOOST_FOREACH( IniParser::value_type &node , /

iniParser.get_child( "modules" ) )

{

moduleSet.insert( node.second.data() );

}

std::string strIndex( "1" );

IniParser reportINI;

reportINI.put( "debug.log_name" , strLogName );

reportINI.put( "debug.level" , iLogLevel);

BOOST_FOREACH( const std::string &strName , moduleSet )

{

reportINI.put( "modules.module" + strIndex , /

strName );

strIndex[ 0 ] += 1;

}

write_ini( strReportName , reportINI );

*/

typedef ::boost::property_tree::ptree XmlParser;

XmlParser xmlParser;

const std::string strNullString = "";

const int iDefaultIntValue = 0;

read_xml( strConfigName , xmlParser );

const std::string strLogName = xmlParser.get( "debug.log_name" , strNullString );

const int iLogLevel = xmlParser.get( "debug.level" , iDefaultIntValue );

typedef std::set< std::string > ModuleSet;

ModuleSet moduleSet;

BOOST_FOREACH( XmlParser::value_type &node , /

xmlParser.get_child( "debug.modules" ) )

{

moduleSet.insert( node.second.data() );

}

XmlParser reportXml;

reportXml.put( "debug.log_name" , strLogName );

reportXml.put( "debug.level" , iLogLevel);

BOOST_FOREACH( const std::string &strName , moduleSet )

{

reportXml.put( "debug.modules.module" , /

strName );

}

write_xml( strReportName , reportXml );

return EXIT_SUCCESS;

}