我正在尝试编写一个 XML 解析器,将 XML 文件解析为 aboost::property_tree
并遇到了这个问题。我如何(快速)检查某个属性的孩子是否存在?
显然我可以遍历所有使用的孩子BOOST_FOREACH
- 但是,没有更好的解决方案吗?
我正在尝试编写一个 XML 解析器,将 XML 文件解析为 aboost::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... 如果你关心性能并且有记忆备用,您可以使用地图容器进行快速查找。
可以使用的另一种方法是在您不想检查一些潜在的丢失子/节点的情况下使用。尝试使用迭代器:
if (node.begin() != node.end()) { // Node does have child[ren]
// Code to process child nodes
}