使用boost :: property_tree读取ini文件不能使用表单A.x的子节点

时间:2014-01-08 08:51:59

标签: c++ boost boost-propertytree

我有一个以下格式的文件,我试图使用boost :: property_tree :: read_ini和boost :: property_tree来解析。

示例配置文件(某些值包含空格)

[Config] 
A = 1000 
B.x = Test 
B.y = Test By 
C.x.y = Test_Cxy 
C.x.z = Test Cxz
[Config2]
...

示例代码

 boost::property_tree::ptree config;
 boost::property_tree::read_ini (name, config);

// Correctly Iterates through and displays correct pairs
 for (ptree::const_iterator it = pt.begin(); it != end; ++it) {
        std::cout << it->first << ": " << it->second.get_value<std::string>() << std::endl;
        print(it->second);
    }

const boost::property_tree::ptree& configTree = config.get_child("Config");


// Correctly gets A
std::string test_ = configTree.get<std::string>("A", "Default");

// Doesn't get B.x
std::string test_ = configTree.get<std::string>("B.x", "Default");

我做错了什么?我如何正确地获得B.x,B.y等?那是B.x被视为B的孩子吗?因此我需要B的get_child?

1 个答案:

答案 0 :(得分:0)

属性树是一种分层数据结构,其中每个节点可以具有有序的子节点序列。从这个意义上讲,属性树比平面ini文件更类似于XML。虽然它可以从ini文件和XML初始化,但它代表内部数据完全相同,查询“x.y.z”具有选择x的y子项的z子项的特殊含义。

归结为属性树的string_path类,其默认分隔符为.

/// Default path class. A path is a sequence of values. Groups of values
/// are separated by the separator value, which defaults to '.' cast to
/// the sequence's value type. The group of values is then passed to the
/// translator to get a key.

总体而言,当您使用ini文件时,要么避免项目名称中的点,要么通过明确构造路径来更改分隔符:

configTree.get<std::string>(ptree::path("B.x", '/')); // using non-default separator