使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级

Posted

技术标签:

【中文标题】使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级【英文标题】:Reading ini file using boost::property_tree not working with children of form A.x 【发布时间】:2014-01-08 08:51:59 【问题描述】:

我有一个以下格式的文件,我正在尝试使用 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 的_child?

【问题讨论】:

【参考方案1】:

属性树是一种分层数据结构,其中每个节点都可以有一个有序的子节点序列。从这个意义上说,属性树比平面 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

【讨论】:

以上是关于使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级的主要内容,如果未能解决你的问题,请参考以下文章

boost::property_tree::xml_writer_settings 的编译错误

如何使用 boost::property_tree 重置 xml 元素的属性?

从 boost::property_tree 读取数组出现空白

使用boost::property_tree生成带attribute的xml

如何区分两个 boost::property_tree?

如何从 boost::property_tree 获取枚举?