4

我需要将未命名的节点添加到 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 和名称 char*。

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

4

2 回答 2

13

我认为 Boost.Property_tree 没有充分的理由在add_childor中禁止空路径put_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"]}}}
于 2011-11-18T18:45:45.447 回答
6

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

对我来说,解决问题的关键是记住 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 类型定义,因此我们不能将 std::copy 与 back_inserter 迭代器一起使用。但是我们可以将 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>
于 2013-07-14T08:34:21.137 回答