如何使用boost属性树获取ini文件的子部分中的属性?

时间:2013-05-21 14:53:41

标签: boost ini boost-propertytree ptree

我正在尝试使用Boost属性树来读取包含属性的INI文件,这些文件具有“组合”的路径名。

例如,我的INI文件如下所示:

[my.section.subsection1]
someProp1=0

[my.section.subsection2]
anotherProp=1

我用以下代码阅读:

namespace pt = boost::property_tree;

pt::ptree propTree;
pt::read_ini(filePath, propTree);
boost::optional<uint32_t> someProp1 = pt.get_optional<uint32_t>("my.section.subsection1.someProp1");

问题在于我从未得到someProp1 ...

的价值

当我遍历第一个树级别时,我将整个部分名称my.section.subsection1视为关键。有没有办法让read_ini函数用点作为树层次结构来解析节名称?

1 个答案:

答案 0 :(得分:4)

如果希望属性树反映层次结构,则需要编写自定义解析器。根据INI解析器documentation

  

INI是一种简单的键值格式,具有单级切片。 [...]并非所有属性树都可以序列化为INI文件。

由于单级切片,my.section.subsection1必须被视为键,而不是层次结构路径。例如,my.section.subsection1.someProp1路径可以分解为:

           key    separator  value 
 .----------^---------. ^ .---^---.
|my.section.subsection1|.|someProp1|

因为“。”是密钥的一部分,boost::property_tree::string_path类型必须使用不同的分隔符显式实例化。它在path_type上以ptree typedef格式提供。在这种情况下,我选择使用“/”:

 ptree::path_type("my.section.subsection1/someProp1", '/')

使用example.ini包含:

[my.section.subsection1]
someProp1=0

[my.section.subsection2]
anotherProp=1

以下计划:

#include <iostream>

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

int main()
{
  namespace pt = boost::property_tree;
  pt::ptree propTree;

  read_ini("example.ini", propTree);

  boost::optional<uint32_t> someProp1 = propTree.get_optional<uint32_t>(
    pt::ptree::path_type( "my.section.subsection1/someProp1", '/'));
  boost::optional<uint32_t> anotherProp = propTree.get_optional<uint32_t>(
    pt::ptree::path_type( "my.section.subsection2/anotherProp", '/'));
  std::cout << "someProp1 = " << *someProp1 
          << "\nanotherProp = " << *anotherProp
          << std::endl;
}

产生以下输出:

someProp1 = 0
anotherProp = 1