2017-02-24 1 views
2

J'essaie de transmettre les éléments d'un boost :: property_tree :: ptree à une fonction. En détail, je dois suivant le code XML à partir duquel un ptree est initialisés:boost :: property_tree passant sous-arbre y compris <xmlattr>

<Master Name='gamma'> 
    <Par1 Name='name1'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par1> 
    <Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 
</Master> 

Je voudrais passer une partie de celui-ci à une fonction. Fondamentalement, je veux passer:

<Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 

La fonction pourrait ressembler à ceci:

void processTree(which_type_do_I_put_here element){ 
    std::string n = element.get<std::string>("<xmlattr>.Name"); 
    double val = element.get<double>("Value"); 
} 

En général je pourrais passer un sous-arbre en utilisant ptree::get_child("par2"). Cela a l'inconvénient que la fonction n'a pas accès à <xmlattr> de ce nœud.

Comment puis-je passer cette partie de l'arborescence avec accès à <xmlattr>? Merci d'avance pour vos idées.

~ Peter

+0

'' n'a rien de spécial, c'est juste un arbre enfant. Donc 'get_child (" par2 ")' retourne simplement un arbre qui a un arbre enfant ''. – zett42

Répondre

3

Le type est un ptree.

En général, je pouvais passer un sous-arbre en utilisant ptree :: get_child ("par2").

En effet.

Ceci a pour inconvénient que la fonction n'a pas accès à de ce nœud

Ce qui ne va pas:

Live On Coliru

#include <boost/property_tree/xml_parser.hpp> 
#include <iostream> 

std::string const sample = R"(
<Master Name='gamma'> 
    <Par1 Name='name1'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par1> 
    <Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 
</Master> 
)"; 

using boost::property_tree::ptree; 

void processTree(ptree const& element) { 
    std::string n = element.get<std::string>("<xmlattr>.Name"); 

    double val = element.get<double>("Value"); 
    std::cout << __FUNCTION__ << ": n=" << n << " val=" << val << "\n"; 
} 

int main() { 
    ptree pt; 
    { 
     std::istringstream iss(sample); 
     read_xml(iss, pt); 
    } 

    processTree(pt.get_child("Master.Par2")); 
} 

qui imprime:

processTree: n=name2 val=0 
+0

Fonctionne comme un charme. J'ai essayé de l'appliquer avant et pour certaines raisons que je ne me souviens pas, cela n'a pas fonctionné. Merci beaucoup! – hansgans