31

まず第一に、私はそれがどのように行われるべきかを理解したと思いますが、私のコードは私が試した方法でコンパイルされません。私は、空の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:'初期化中':'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'のメンバーではありません

では、どうすればよいでしょうか。BoostPtreeを反復処理して、サブPtreeを取得する方法を教えてください。

更新: 私もそのようなコードを試しました

    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で何かがうまくいかなかった-今私はそのコードで正しい結果を得る。

4

3 に答える 3

33

(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.
}
于 2011-07-11T23:39:29.960 に答える
27

C ++ 11を使用すると、以下を使用して、次のノードのすべての子を反復処理できますpath

ptree children = pt.get_child(path);
for (const auto& kv : children) {
    // kv is of type ptree::value_type
    // kv.first is the name of the child
    // kv.second is the child tree
}
于 2013-12-06T18:30:42.873 に答える
8

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

パスセレクターの「shows」については何も見つかりませんでした。サブアレイを選択します。(最後のドットに注意してください)

いくつかの優れたドキュメントはここにあります:http: //kaalus.atspace.com/ptree/doc/index.html

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

于 2012-12-31T11:48:48.863 に答える