41

我正在尝试编写一个 XML 解析器,将 XML 文件解析为 aboost::property_tree并遇到了这个问题。我如何(快速)检查某个属性的孩子是否存在?

显然我可以遍历所有使用的孩子BOOST_FOREACH- 但是,没有更好的解决方案吗?

4

5 回答 5

54
optional< const ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
于 2011-09-27T12:19:12.243 回答
23

这里有几个其他的选择:

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

ptree::const_assoc_iterator it = ptree.find("possibly_missing");
if( it == ptree.not_found() )
{
   ...
}
于 2012-07-06T04:29:21.893 回答
7

包括这个:

#include <boost/optional/optional.hpp>

删除const

boost::optional< ptree& > child = node.get_child_optional( "possibly_missing_node" );
if( !child )
{
  // child node is missing
}
于 2014-08-19T17:18:55.990 回答
1

虽然这些解决方案似乎可以避免在树上进行迭代,但请记住,在幕后他们仍然在这样做,所以你正在使你的算法潜在地 n^2... 如果你关心性能并且有记忆备用,您可以使用地图容器进行快速查找。

于 2014-07-23T15:28:32.230 回答
0

可以使用的另一种方法是在您不想检查一些潜在的丢失子/节点的情况下使用。尝试使用迭代器:

if (node.begin() != node.end()) { // Node does have child[ren]
     // Code to process child nodes
}
于 2021-10-28T07:24:32.390 回答