考虑到以下XML文件:
<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")但有没有更好的方法?
发布于 2016-06-18 16:45:17
您可以在equal_range()上使用property_tree成员函数,它返回一个迭代器的std::pair,该迭代器用特定的键标记一系列子节点。然后您可以使用升压范围对范围进行操作。
这与C++11的auto类型说明符和基于范围的循环(或BOOST_AUTO和BOOST_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;
}基于CoLiRu的演示
这在算法上比检查每一个孩子都要好,尽管我怀疑它在普通用法上有很大的不同。
https://stackoverflow.com/questions/37886341
复制相似问题