如果您希望屬性樹反映層次結構,那麼它需要編寫自定義分析器。每個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
typedef在ptree
上提供。在這種情況下,我已選擇使用 「/」:
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
謝謝你的回覆。是否(很容易)可以擴展默認的INI解析器,以便能夠根據節名反映層次結構? – greydet
@greydet:我只簡單地看了一下解析器代碼,但看起來並不複雜。另一種選擇是忽略解析,而是能夠擴展和/或扁平化一個層級'ptree'到/從一個層級'ptree'。 –