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?
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
// child node is missing
}
Voici quelques autres alternatives:
if( node.count("possibliy_missing") == 0 )
{
...
}
ptree::const_assoc_iterator it = ptree.find("possibly_missing");
if( it == ptree.not_found() )
{
...
}
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
}
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.