web-dev-qa-db-fra.com

Boost PropertyTree: vérifiez si l'enfant existe

J'essaie d'écrire un analyseur XML, en analysant le fichier XML dans un boost::property_tree et est tombé sur ce problème. Comment puis-je vérifier (rapidement) si un enfant d'une certaine propriété existe?

De toute évidence, je pouvais parcourir tous les enfants en utilisant BOOST_FOREACH - mais n'y a-t-il pas une meilleure solution à cela?

34
paul23
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
48
RobH

Voici quelques autres alternatives:

if( node.count("possibliy_missing") == 0 )
{
   ...
}

ptree::const_assoc_iterator it = ptree.find("possibly_missing");
if( it == ptree.not_found() )
{
   ...
}
19
Michael Anderson

Inclure ceci:

#include <boost/optional/optional.hpp>

Supprimez le const:

boost::optional< ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
4
Mohamed Ali Said

Bien que ces solutions puissent sembler éviter d'itérer sur l'arborescence, gardez à l'esprit que sous les couvertures, elles font toujours exactement cela, donc vous créez potentiellement votre algorithme n ^ 2 ... si vous êtes préoccupé par les performances et avez de la mémoire pour de rechange, vous pouvez utiliser un conteneur de carte pour des recherches rapides.

1
Rich