首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只选择Boost ptree的节点

只选择Boost ptree的节点
EN

Stack Overflow用户
提问于 2016-06-17 16:32:12
回答 1查看 860关注 0票数 1

考虑到以下XML文件:

代码语言:javascript
复制
<debug>
    <modules group="0">
        <module>Finance</module>
        <module>Admin</module>
        <module>HR</module>
    </modules>
</debug>

使用Boost.PropertyTree,可以迭代节点的子节点:

代码语言:javascript
复制
BOOST_FOREACH(ptree::value_type &v, pt.get_child("debug.modules"))
{
}

但是,由于属性也被视为子属性,“模块”的第一个子属性将是“组”,而不是“模块”。是否有选择属性树的唯一子节点的方法?一种可能是检查

代码语言:javascript
复制
if(v.first == "module")

但有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-18 16:45:17

您可以在equal_range()上使用property_tree成员函数,它返回一个迭代器的std::pair,该迭代器用特定的键标记一系列子节点。然后您可以使用升压范围对范围进行操作。

这与C++11的auto类型说明符和基于范围的循环(或BOOST_AUTOBOOST_FOREACH)很好地配合:

代码语言:javascript
复制
#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的演示

这在算法上比检查每一个孩子都要好,尽管我怀疑它在普通用法上有很大的不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37886341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档