【发布时间】:2011-11-25 23:38:24
【问题描述】:
我正在尝试编写一个 XML 解析器,将 XML 文件解析为 boost::property_tree 并遇到了这个问题。如何(快速)检查某个属性的子对象是否存在?
显然,我可以使用 BOOST_FOREACH 遍历所有孩子 - 但是,没有更好的解决方案吗?
【问题讨论】:
标签: c++ boost boost-propertytree
我正在尝试编写一个 XML 解析器,将 XML 文件解析为 boost::property_tree 并遇到了这个问题。如何(快速)检查某个属性的子对象是否存在?
显然,我可以使用 BOOST_FOREACH 遍历所有孩子 - 但是,没有更好的解决方案吗?
【问题讨论】:
标签: c++ boost boost-propertytree
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
}
【讨论】: