Ответ 1
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
// child node is missing
}
Я пытаюсь написать синтаксический анализатор XML, анализируя XML файл на boost::property_tree
и столкнулся с этой проблемой. Как я могу проверить (быстро), если существует дочерний элемент определенного свойства?
Очевидно, что я мог выполнять итерацию по всем детям с помощью BOOST_FOREACH
- однако, нет ли лучшего решения для этого?
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
// child node is missing
}
Вот несколько других альтернатив:
if( node.count("possibliy_missing") == 0 )
{
...
}
ptree::const_assoc_iterator it = ptree.find("possibly_missing");
if( it == ptree.not_found() )
{
...
}
Включите это:
#include <boost/optional/optional.hpp>
Удалите const
:
boost::optional< ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
// child node is missing
}
Несмотря на то, что эти решения могут избежать итерации по дереву, просто имейте в виду, что под обложками они все еще делают именно это, поэтому вы производите свой алгоритм n ^ 2... если вас беспокоит производительность и у вас есть память, вы можете использовать контейнер карты для быстрого поиска.