一. 目标
首先这个标题,我本来想写《XML配置文件解析框架以及自动代码生成》,可这样会让读者误以为是XML解析器,虽然有“配置文件”几个字,但还是很绕;然 后又想写《基于XML的配置文件解析框架以及自动代码生成》,这样又会误以为框架和代码是XML来表现的,虽然我没见过这种东西,不过见多识广的人就说不 定了。最终我取了这个标题,表明我的目的无非是要做一个库来解析基于XML的配置文件。
很多程序需要配置文件,特别是一些服务程序,配置文件来保存输入参数来控制策略等等。一般是以ini,注册表或者XML的形式出现,近年来,XML有一统天下的趋势,其中原因就不用我说了。
本文只讨论面向应用的配置文件解析,也就是说配置文件的字段的名称是可以自主决定的。
假如我的服务程序需要配置如下几类参数:
1. 本地监听端口密码
2. 工作线程数,网络收发线程数
3. 内存池数,包括64,256,1k, 4k...
4. 数据库连接参数:地址、端口、数据库名、帐号、密码
那么可能希望最终的配置是这样的
<?xml version="1.0" encoding="utf-8"?>
<MSG_CONFIG>
<IE_LISTEN listen_ip="0.0.0.0" listen_port="9876" />
<IE_THREAD netthread_cnt="8" workthread_cnt="12" />
<IE_POOL pool_header_size="20"
pool_1k_size="1024"
pool_16k_size="512"
pool_64k_size="256" />
<IE_DATABASE server_ip="127.0.0.1" server_port="5432" dbname="pda"
user="YOMI" password="HELLO" />
</MSG_CONFIG>
恩,我们的任务就是解析这样的一个XML的文件,以方便的形式给我们的程序用。
程序里方便使用的自然是结构:
struct IE_LISTEN
{
string listen_ip;
unsigned short listen_port;
};
struct IE_THREAD
{
int pool_header_size;
int pool_1k_size;
int pool_16k_size;
int pool_64k_size;
};
struct IE_DATABASE
{
string server_ip;
unsigned short server_port;
string dbname;
string user;
string password;
};
struct MSG_CONFIG
{
struct IE_LISTEN ie_listen;
struct IE_THREAD ie_thread;
struct IE_DATABASE ie_database;
};
只要把配置文件解析到这样的MSG_CONFIG结构里,我们就算大功告成。
当然,解析的代码不能多,最终我做到了只要写这么几行即可解析整个配置文件:
impl_ptr_是MSG_CONFIG的智能指针:
uxml::MSG_CONFIG_PTR impl_ptr_;
int svc_config::load(const char* filepath)
{
uxml_node_factory factory;
uxml_msg_registor registor(factory);
uxml_parser parser;
uxml_node_base_ptr root = uxml_node_base_ptr::__dynamic_cast(impl_ptr_);
if(parser.parser(root, factory, filepath))
{
ACE_DEBUG((LM_DEBUG, "[%M][%T][%t] parser config file failed/n"));
return -1;
}
return 0;
}
load如果返回0表示解析成功,即可使用impl_ptr_取配置参数了。
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1447944
本文介绍了一种基于XML的配置文件解析框架及其实现方法。该框架可以将XML配置文件转换为C++结构体,便于程序读取配置信息。示例中展示了如何定义配置项结构体并实现XML配置文件的解析。
1727

被折叠的 条评论
为什么被折叠?



