2016-06-17 69 views
1

的唯一節點考慮下面的XML文件:選擇升壓ptree中

<debug> 
    <modules group="0"> 
     <module>Finance</module> 
     <module>Admin</module> 
     <module>HR</module> 
    </modules> 
</debug> 

隨着Boost.PropertyTree就可以遍歷一個節點的孩子:

BOOST_FOREACH(ptree::value_type &v, pt.get_child("debug.modules")) 
{ 
} 

但由於屬性也被認爲是一個孩子,「模塊」的第一個孩子將是「組」,但不是「模塊」。 有什麼辦法只選擇屬性樹的子節點? 一種可能性是,以檢查

if(v.first == "module") 

,但有沒有什麼更好的辦法?

回答

2

您可以使用equal_range()成員函數property_tree,它返回一個std::pair迭代器,用一個特定的鍵標記一系列子節點。然後您可以使用Boost Range在該範圍內進行操作。

這個作品有很好的C++ 11的auto類型說明符和範圍爲基礎的循環(或BOOST_AUTOBOOST_FOREACH):

#include <iostream> 
#include <sstream> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <boost/range/iterator_range.hpp> 

static const std::string input = 
    "<debug>" 
    " <modules group=\"0\">" 
    " <module>Finance</module>" 
    " <module>Admin</module>" 
    " <module>HR</module>" 
    " </modules>" 
    "</debug>"; 

int main() { 
    std::istringstream istream(input); 
    boost::property_tree::ptree ptree; 
    boost::property_tree::read_xml(istream, ptree); 

    const auto range = ptree.get_child("debug.modules").equal_range("module"); 
    for (auto& child : boost::make_iterator_range(range)) { 
     std::cout << child.first << std::endl; 
    } 

    return 0; 
} 

Demo on CoLiRu

這是算法比檢查每一個孩子更好,雖然我懷疑它在普通用法上有什麼不同。

+0

完美。這是我搜索的解決方案。這對我來說可以。謝謝! – Randir