41

XMLパーサーを書き込もうとして、XMLファイルをに解析しようとするboost::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

使用できるもう1つの方法は、欠落している可能性のある子/ノードをチェックしたくない場合に使用することです。イテレータを使用してみてください:

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