Boost property_tree 解析配置文件

原创 2016年01月27日 22:12:24

在日常的开发系统中,不可避免的会解析配置文件,因为使用配置文件更直观,而且修改配置文件就不用再编译代码,当工程很大的时候,编译代码会是一件很痛苦的事。不同的需求的配置文件不同,Boost提供了一个property_tree来解析.xml,.ini,.json,.info四种格式配置文件。

.xml文件

.xml现在已经被广泛应用到数据交换格式,并且property_tree是树形结构,和.xml文件格式很相近。基本格式是<attribute> value </attribute> ,属性包含属性值的形式。现在以学生信息举例。

<conf>
<school> scu </school>
<person>
    <name> freehyan </name>
    <sex> male </sex>
    <age> 22 </age>
</person>
</conf>

property_tree 源码浅析

template <typename Key, typename Data, typename KeyCompare>
class basic_ptree
{
    public:
        typedef basic_ptree<Key, Data, KeyCompare> self_type;
        typedef std::pair<const Key, self_type>    value_type;

        basic_ptree();
        basic_ptree& operator=(const self_type & );

    //...

        data_type& data();
        template<typename Type> Type get(const path_type &) const;

        self_type& get_child(const path_type &);
        self_type& put_child(const path_type &, const self_type &);
        self_type& add_child(const path_type &, const self_type &);
    //...
}

property_tree的核心类是basic_tree,内部重新定义了两个重要类型self_type, value_type。self_type是模板实例化的自身类型,而value_type是节点的数据结构,本质是std::pair,含有节点的属性名和本身。最后几个函数是获取,添加等操作,注意源码内容不止于此。basic_tree不能直接使用,通常使用的是 typedef basic_ptree<std::string, std::string> ptree;

读取.xml

Boost中property_tree内部使用的是小巧开源xml解析器–rapidxml。读取配置文件是通过read_xml函数,当节点不存在的时候,会抛出异常。

  • 在初始化ptree后,可以使用get()通过路径访问属性树内节点,用模板参数指明获取属性的类型。路径分隔符是(.),小数点的样子。
    如: pt.get<std::string>("conf.theme")
  • ptree的get()函数支持缺省值的用法,即如果属性不存在,则使用缺省值。由于缺省值已经有类型信息,因此get()的返回值类型可以自动推导,所以不必再加模板参数。
    如:pt.get("conf.theme", 100);
  • 访问有多个属性值的子节点,比如第一部分中的person就是这样的子节点。可以通过迭代器的方式访问获取值。
auto child =  pt.get_child("conf.person");
for (auto& x  : child)
{
    std::cout << x.first;
    std::cout << x.second.get_value<std::string>() << std::endl;
}
for (auto pos=child.begin(); pos != child.end(); pos++)
{
    std::cout << pos->second.get_value<std::string>() << std::endl;
}

写入.xml

有读就有写,property_tree也支持写入配置信息,从源码中就可以看出相应的函数,使用模板函数put()可以修改属性树的节点值,如果节点不存在就新增节点,如果存在就修改属性值。不过通常put()不需要指定模板参数,因为和缺省值读取一样,写入也可以自行推导。

    pt.put("conf.theme", "black theme");
    boost::property_tree::write_xml("abc.xml", pt);

更多用法

其实basic_tree的语法很像stl容器,所以大部分的函数api对其也适用,因为它就像std::list<std::string, boost::property_tree::ptree> ,比如可以使用find函数。
属性树的标签名是属性名,内容是属性值。节点的属性保存在节点<xmlattr>的下级节点,注释保存在<xmlcomment>中。

<conf>
<!-- comment -->
<theme id = "1001"> black theme </theme>
</conf>
boost::property_tree::ptree pt;
boost::property_tree::read_xml("abc.xml", pt);
std::cout << pt.get<std::string>("conf.<xmlcomment>") << std::endl;
std::cout << pt.get<int>("conf.theme.<xmlattr>.id") << std::endl;

参考

【1】 Boost 程序库完全开发指南,书籍
【2】http://www.cnblogs.com/qicosmos/p/3555668.html
【3】http://www.boost.org/doc/libs/1_60_0/doc/html/property_tree.html

boost property_tree 解析json文件

boost property_tree解析json文件相关文档如下:json_parser 、basic_ptree json_parser: read_json(filename, p...
  • shyanyang
  • shyanyang
  • 2015年03月11日 20:28
  • 4225

使用 Boost 的 Property Tree 處理 xml

写的不错,原帖:http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=315 Boost C+...
  • yacper
  • yacper
  • 2012年09月27日 17:49
  • 8757

boost的property_tree组件

stl中对线性表有充分的实现,无论是vector还是list都是典型的线性表,即便是set和map,尽管实现上采用了诸如红黑树之类的树形结构,但那仅仅是为了快速检索的需要,从语义上来说它们依旧是线性表...
  • oowgsoo
  • oowgsoo
  • 2014年12月29日 21:45
  • 12348

boost::property_tree实例用法

boost::property_tree 的解析xml模块是基于rapidXml的, 以下是两个例子: 例子1:  [cpp] view plaincopy ...
  • ufe_1
  • ufe_1
  • 2012年09月29日 13:42
  • 7122

boost::property_tree 基本用法

最近在开发C++时需要解析和设置配置文件XML,用了boost::property_tree ,看了相关资料并做了一下小小的总结: 1.读取单个值 XML: zhan...
  • baidu_34788529
  • baidu_34788529
  • 2016年04月25日 21:17
  • 301

使用Boost property tree来解析带attribute的xml

boost property tree的5分钟教程虽然简单明了,可惜使用的xml不够典型。今天由于工作上要读取带属性并且有几层嵌套的xml配置文件,因此研究了一下如何使用。下面直接列出测试用的xml文...
  • mosaic
  • mosaic
  • 2011年10月19日 21:06
  • 6946

boost::property_tree讲解

转自:http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=315 Boost C++ L...
  • hp_justdoit
  • hp_justdoit
  • 2014年07月04日 16:59
  • 631

boost库之ptree的ini配置文件解析

// FirstTest.cpp : 定义控制台应用程序的入口点。 //ptree解析ini文件,get(treename, translator) :translator类型实例 #include...
  • Leeboy_Wang
  • Leeboy_Wang
  • 2015年03月02日 10:15
  • 3164

boost 操作配置文件

#include #include //#include //#include //#include using namespace std; int main() { ptree p...
  • wangxvfeng101
  • wangxvfeng101
  • 2013年10月12日 09:50
  • 3511

c++用boost的property_tree库来操作xml配置文件

property_tree用的 XML 解析器是 RapidXML,深入研究一下它还是有好处的。 有了property_tree库,c++上读写xml配置文件也变得异常轻松了。(开始时很怀念c#里的a...
  • lincyang
  • lincyang
  • 2010年12月11日 15:07
  • 7117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Boost property_tree 解析配置文件
举报原因:
原因补充:

(最多只允许输入30个字)