我有一个以下格式的文件,我试图使用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?
答案 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