web-dev-qa-db-fra.com

Boost 1.46.1, arbre des propriétés: comment parcourir les sous-arbres recevant ptree?

Tout d'abord, je dirai que je pense avoir compris comment cela devrait être fait, mais mon code ne compilera en aucune façon. J'ai basé mon hypothèse sur cet exemple officiel d'astuce ptree vide . Vous y trouverez la ligne suivante:

  const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());

Ce qui montre qu'il est (ou devrait être) possible d'extraire des sous-arbres de ptree.

J'ai donc supposé que nous pouvions itérer sur ptree avec quelque chose comme BOOST_FOREACH de cette manière:

BOOST_FOREACH(const boost::property_tree::ptree &v,
    config.get_child("servecies"))
{

}

Mais je reçois la prochaine erreur:

Erreur 1 Erreur C2440: 'initialisation': impossible de convertir de 'std :: pair <_Ty1, _Ty2>' en 'const boost :: property_tree :: ptree &'

ou si j'essaye

BOOST_FOREACH(boost::property_tree::ptree &v,
    config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{

}

Je reçois:

Erreur 1 erreur C2039: 'empty_ptree': n'est pas membre de 'boost :: property_tree'

Alors, que dois-je faire: comment itérer à travers Boost Ptree et obtenir des sous-arbres?

Mise à jour: J'ai aussi essayé un tel code

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

Ceci compile, ne jette aucune exception mais ne crée aucune Sub data, il parcourt simplement ce cycle.

Mise à jour 2:

Hm ... quelque chose s'est probablement mal passé dans mon xml - maintenant j'obtiens des résultats corrects avec ce code.

30
Rella

Les itérateurs de l'arborescence des propriétés pointent vers des paires de la forme (key, tree) de type ptree::value_type. La boucle standard pour itérer à travers les enfants du nœud à path ressemble donc à:

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

En utilisant C++ 11, vous pouvez utiliser ce qui suit pour parcourir tous les enfants du nœud à 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

J'ai eu le même problème avec l'itération des sous-nœuds JSON

boost::property_tree::read_json(streamJSON, ptJSON);

Si vous avez une structure comme:

{
 playlists: [ {
   id: "1",
   x: "something"
   shows: [
    { val: "test" },
    { val: "test1" },
    { val: "test2" }
   ]
 },
 {
   id: "2"
   x: "else",
   shows: [
    { val: "test3" }
   ]
 }
 ]
}

Vous pouvez parcourir les nœuds enfants de la manière suivante:

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

Je n'ai rien trouvé sur les "émissions" du sélecteur de chemin. pour sélectionner le sous-tableau. (remarquez le point à la fin)

Une bonne documentation peut être trouvée ici: http://kaalus.atspace.com/ptree/doc/index.html

J'espère que cela aide quelqu'un.

5
Evalds Urtans