2011-07-11 7 views
29

En primer lugar, diré que creo que tengo cómo hacerlo, pero mi código no se compilará de ninguna manera. Basé mi suposición en this official example of empty ptree trick. Allí se puede encontrar la siguiente línea:Boost 1.46.1, Árbol de propiedades: ¿Cómo iterar a través de subárboles de recepción de phare?

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

Lo que demuestra que es (o debería ser) posible conseguir subptree desde ptree.

así que supuse que podría iterar a través de ptree con algo como BOOST_FOREACH de tal manera:

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

} 

Pero consigo siguiente error:

Error 1 error C2440: 'initializing' : cannot convert from 'std::pair<_Ty1,_Ty2>' to 'const boost::property_tree::ptree &'

o si intento

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

} 

obtengo:

Error 1 error C2039: 'empty_ptree' : is not a member of 'boost::property_tree'

Entonces, ¿qué debo hacer: cómo iterar a través de Boost Ptree y obtener sub Ptrees?

Actualización: También probé dicho código

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

Esto compila, no lanza ningún Excepciones pero no cout cualquier Sub data, sólo skeeps a través de este ciclo.

Actualización 2:

Hm ... probablemente algo salió mal en mi xml - ahora consigo resultados correctos con ese código.

Respuesta

30

Los iteradores de árbol de propiedades apuntan a pares de la forma (key, tree) del tipo ptree::value_type. El bucle estándar para la iteración a través de los hijos del nodo en path por lo tanto se parece a:

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. 
} 
+0

mi problema es que tengo una especie de matriz de objetos. Así que tengo, por ejemplo, { "servecie": { "módulo": [ "archivo" , "Admin", "HR" ] } "servecie": { "módulo": [ " archivo ", " Admin ", " HR " ] } } y necesito obtener cada objeto como seprate pree. ¿Es eso posible? – Rella

+1

@Kabumbus Sí. Los valores 'v.second' serán los ptrees para los objetos de la matriz. – antonakos

5

que tenía el mismo problema con la iteración mínimas JSON sub nodos

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

Si usted tiene una estructura como:

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

Se puede recorrer nodos secundarios mínimas de esta manera:

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

No pude encontrar nada sobre el selector de ruta "muestra". para seleccionar la matriz secundaria. (Nótese el punto al final)

Algunos buena documentación se puede encontrar aquí: http://kaalus.atspace.com/ptree/doc/index.html

Espero que esto ayude a alguien.

20

Usando C++ 11, puede utilizar el siguiente para iterar a través de todos los hijos del nodo en 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 
} 
+1

En mi opinión, la mejor solución, pero quizás un poco más al ejemplo hubiera sido buena. – gauteh

Cuestiones relacionadas