4

JSONパーサーが配列に対して行うのと同じように、名前のないノードをboost::property_tree::ptreeに追加する必要があります。ただし、実行したい場合は、実行時に次のようなアサーションが表示されます。

  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

add_childBoost.Property_tree に、またはの空のパスを禁止する正当な理由があるとは思わない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 のコレクションであることを思い出すことでした。したがって、問題は「ある ptree から別の ptree に value_types を追加するにはどうすればよいか」ということになります。

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));

親が XML として出力される場合、以下が含まれます。

<Value1>1</Value1>
<Value2>2</Value2>
于 2013-07-14T08:34:21.137 に答える