まず第一に、どうやったらいいかはわかったと思うが、私のコードは試してみてもコンパイルできない。 空のptreeトリックのこの公式例 に基づいて仮定しました。そこで次の行を見つけることができます:
const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());
これは、ptreeからsubptreeを取り出すことが可能であることを示しています。
そのため、次のような方法でBOOST_FOREACH
のようなものでptreeを反復処理できると想定しました。
BOOST_FOREACH(const boost::property_tree::ptree &v,
config.get_child("servecies"))
{
}
しかし、次のエラーが発生します:
エラー1エラーC2440: 'initializing': 'std :: pair <_Ty1、_Ty2>'から 'const boost :: property_tree :: ptree&'に変換できません
または私がしようとした場合
BOOST_FOREACH(boost::property_tree::ptree &v,
config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{
}
私は得る:
エラー1エラーC2039: 'empty_ptree': 'boost :: property_tree'のメンバーではありません
だから私は何をすべきか:ブーストPtreeを通して反復し、サブPtreeを取得する方法は?
Update:私もそのようなコードを試しました
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
}
}
これはコンパイルされ、例外をスローしませんが、Sub data
をカウントしません。このサイクルをスキップします。
更新2:
うーん...おそらく私のXMLで何かが間違っていた-今、私はそのコードで正しい結果を取得します。
プロパティツリー反復子は、(key, tree)
タイプのptree::value_type
。したがって、path
にあるノードの子を反復処理するための標準ループは次のようになります。
BOOST_FOREACH(const ptree::value_type &v, pt.get_child(path)) {
// v.first is the name of the child.
// v.second is the child tree.
}
C++ 11を使用すると、以下を使用して、path
にあるノードのすべての子を反復処理できます。
ptree children = pt.get_child(path);
for (const auto& kv : children) { // kv is of type ptree::value_type
// v.first is the name of the child
// v.second is the child tree
}
JSONサブノードの繰り返しで同じ問題が発生しました
boost::property_tree::read_json(streamJSON, ptJSON);
次のような構造がある場合:
{
playlists: [ {
id: "1",
x: "something"
shows: [
{ val: "test" },
{ val: "test1" },
{ val: "test2" }
]
},
{
id: "2"
x: "else",
shows: [
{ val: "test3" }
]
}
]
}
次のように、トラフの子ノードを反復できます。
BOOST_FOREACH(boost::property_tree::ptree::value_type &playlist, ptJSON.get_child("playlists"))
{
unsigned long uiPlaylistId = playlist.second.get<unsigned long>("id");
BOOST_FOREACH(boost::property_tree::ptree::value_type &show, playlist.second.get_child("shows."))
{
std::string strVal = show.second.get<std::string>("val");
}
}
パスセレクターの「ショー」について何も見つかりませんでした。サブ配列を選択します。 (末尾のドットに注意してください)
いくつかの優れたドキュメントがここにあります: http://kaalus.atspace.com/ptree/doc/index.html
これが誰かを助けることを願っています。