2013-05-21 68 views
0

我試圖使用Boost屬性樹來讀取INI包含部分內的屬性的文件具有「合成」路徑名。如何使用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函數解析節點名稱作爲樹層次結構?

回答

3

如果您希望屬性樹反映層次結構,那麼它需要編寫自定義分析器。每個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 
+0

謝謝你的回覆。是否(很容易)可以擴展默認的INI解析器,以便能夠根據節名反映層次結構? – greydet

+0

@greydet:我只簡單地看了一下解析器代碼,但看起來並不複雜。另一種選擇是忽略解析,而是能夠擴展和/或扁平化一個層級'ptree'到/從一個層級'ptree'。 –