【问题标题】:Adding unnamed nodes to boost::property_tree::ptree将未命名节点添加到 boost::property_tree::ptree
【发布时间】:2011-11-11 15:56:54
【问题描述】:

我需要向 boost::property_tree::ptree 添加未命名的节点,就像它的 JSON 解析器对数组所做的那样。但是,当我想这样做时,我会在运行时得到这样的断言:

  Assertion failed: !p.empty() && "Empty path not allowed for put_child.", file C:\Program Files\Boost\boost\include/boost/property_tree/detail/ptree_implementation.hpp, line 877

我喜欢

tree.add_child(name, child);

其中 tree 和 child 都是 ptree-s 和 name char*。

我怎么能像 ptree-s 的 JSON 解析器那样做呢?

【问题讨论】:

    标签: c++ boost boost-propertytree


    【解决方案1】:

    我认为 Boost.Property_tree 没有充分的理由禁止 add_childput_child 中的空路径。在其内部路径实用程序中实现根检测的方式需要非空路径。

    您可以通过在添加数组元素时不使用它们的路径实用程序来解决此问题。

    using boost::property_tree::ptree;
    ptree pt;
    pt.put_child( "path.to.array", ptree() );
    auto& array = pt.get_child( "path.to.array" );
    array.push_back( std::make_pair( "", ptree("foo") ) );
    array.push_back( std::make_pair( "", ptree("bar") ) );
    boost::property_tree::json_parser::write_json( std::cout, pt, false );
    // {"path":{"to":{"array":["foo","bar"]}}}
    

    【讨论】:

      【解决方案2】:

      我来到这里试图找出类似的问题。我花了一段时间才解决它,所以希望这篇文章可以帮助其他人。

      对我来说,解决问题的关键是记住 ptree 是 boost::property_tree::ptree::value_type 的集合。所以问题归结为“如何将 value_types 从一个 ptree 添加到另一个”。

      Ptree 提供了一些 value_type 插入的方法:

      iterator push_front(const value_type &);
      iterator push_back(const value_type &);
      iterator insert(iterator, const value_type &);
      

      Ptree 没有 const_reference typedef,所以我们不能使用带有 back_inserter 迭代器的 std::copy。但我们可以将 std::for_each 与绑定函数一起使用。

      #include <algorithm>
      #include <functional>
      #include <boost/property_tree/ptree.hpp>
      
      using namespace std;
      using namespace boost::property_tree;
      
      ...
      
      ptree child;
      child.put("Value1", 1);
      child.put("Value2", 2);
      
      ptree parent;
      std::for_each(child.begin(),
                    child.end(),
                    std::bind(&ptree::push_back, &parent, placeholders::_1));
      

      现在,如果 parent 作为 XML 输出,它将包含:

      <Value1>1</Value1>
      <Value2>2</Value2>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2011-12-30
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        相关资源
        最近更新 更多