web-dev-qa-db-ja.com

Boost 1.46.1、プロパティツリー:サブptreeを受信するptreeを反復処理する方法は?

まず第一に、どうやったらいいかはわかったと思うが、私のコードは試してみてもコンパイルできない。 空の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で何かが間違っていた-今、私はそのコードで正しい結果を取得します。

30
Rella

プロパティツリー反復子は、(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.
}
31
antonakos

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
}
25
Ela782

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

これが誰かを助けることを願っています。

5
Evalds Urtans