首先,我要说的是,我认为应该怎么做,但是我的代码不会以任何方式编译。我的假设基于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/