首先,我要说的是,我认为应该怎么做,但是我的代码不会以任何方式编译。我的假设基于this official example of empty ptree trick。在这里您可以找到下一行:

  const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());

这表明有可能(或应该)从ptree中取出子ptree。

所以我假设我们可以像这样通过BOOST_FOREACH遍历ptree:
BOOST_FOREACH(const boost::property_tree::ptree &v,
    config.get_child("servecies"))
{

}

但我得到下一个错误:



或者如果我尝试
BOOST_FOREACH(boost::property_tree::ptree &v,
    config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{

}

我得到:



所以我该怎么办:如何通过Boost Ptree迭代并获得sub Ptree?

更新:
我也尝试过这样的代码
    BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
    config.get_child("path.to.array_of_objects"))
{
    std::cout << "First data: " << v.first.data() << std::endl;
    boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
    BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
        subtree)
    {
        std::cout << "Sub data: " << vs.first.data() << std::endl;
    }
}

这样可以编译,不抛出任何异常,但是不抛出任何Sub data,它只是在此循环中发生变化。

更新2:

嗯...我的xml中可能出了点问题-现在我用该代码得到了正确的结果。

最佳答案

属性树迭代器指向类型为(key, tree)ptree::value_type形式的对。因此,用于遍历path的节点的子代的标准循环如下所示:

BOOST_FOREACH(const ptree::value_type &v, pt.get_child(path)) {
    // v.first is the name of the child.
    // v.second is the child tree.
}

关于c++ - Boost 1.46.1,属性树: How to iterate through ptree receiving sub ptrees?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6656380/

10-14 04:12