Подтвердить что ты не робот

Boost PropertyTree: проверьте, существует ли ребенок

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

Очевидно, что я мог выполнять итерацию по всем детям с помощью BOOST_FOREACH - однако, нет ли лучшего решения для этого?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

#include <boost/optional/optional.hpp>

Удалите const:

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

Ответ 4

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