XMLパーサーを書き込もうとして、XMLファイルをに解析しようとするboost::property_tree
と、この問題が発生しました。特定のプロパティの子が存在するかどうかを(すばやく)確認するにはどうすればよいですか?
明らかに、私はを使用してすべての子供を反復することができましたBOOST_FOREACH
-しかし、これに対するより良い解決策はありませんか?
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にします。予備として、マップコンテナを使用してすばやく検索できます。
使用できるもう1つの方法は、欠落している可能性のある子/ノードをチェックしたくない場合に使用することです。イテレータを使用してみてください:
if (node.begin() != node.end()) { // Node does have child[ren]
// Code to process child nodes
}