Boost PropertyTree: проверьте, существует ли дочерний элемент - PullRequest
34 голосов
/ 27 сентября 2011

Я пытаюсь написать синтаксический анализатор XML, анализирую файл XML до boost::property_tree и столкнулся с этой проблемой. Как я могу проверить (быстро), существует ли ребенок определенного свойства?

Очевидно, что я могу перебрать всех детей, используя BOOST_FOREACH - однако разве нет лучшего решения для этого?

Ответы [ 4 ]

47 голосов
/ 27 сентября 2011
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
19 голосов
/ 06 июля 2012

Вот несколько других альтернатив:

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

ptree::const_assoc_iterator it = ptree.find("possibly_missing");
if( it == ptree.not_found() )
{
   ...
}
4 голосов
/ 19 августа 2014

Включить это:

#include <boost/optional/optional.hpp>

Удалить const:

boost::optional< ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
1 голос
/ 23 июля 2014

Хотя могут показаться, что эти решения избегают итерации по дереву, просто имейте в виду, что под покровом они все еще делают именно это, поэтому вы делаете свой алгоритм потенциально n ^ 2 ... если вы беспокоитесь о производительности и есть запасная память, вы можете использовать контейнер карт для быстрого поиска.

...