2011-01-04 8 views
14

私は申し訳ありません、前に同じトピックについての質問をしましたが、私の問題はそこに記載されている別の側面です(How to iterate a boost...)。ブーストProperty_Treeイテレータ、それらを処理する方法は?

次のコードを見てみましょう:私は、私が言及した問題で語ら語ってしまったとして、そこにブーストでproperty_treeにイテレータを使用する可能性があるが、私は何を知っていない、まあ

#include <iostream> 
#include <string> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <boost/algorithm/string/trim.hpp> 
int main(int argc, char** argv) { 
    using boost::property_tree::ptree; 
    ptree pt; 
    read_xml("try.xml", pt); 
    ptree::const_iterator end = pt.end(); 
    for (ptree::const_iterator it = pt.begin(); it != end; it++) 
      std::cout << "Here " << it->? << std::endl; 
} 

をタイプ、使用できるメソッドやプロパティ

もう一度ptreeか別のxml階層を表すものが必要であれば、再度閲覧する必要があると思いますが、これに関するドキュメントは非常に悪いと思います。私はなぜか分かりませんが、ドキュメントを格上げしても何も見つからず、ノードをブラウズするためのマクロについては何も見つかりませんが、このアプローチは避けたいものです。

ptreeでイテレータを取得したら、ノード名、値、パラメータ(xmlファイルのノード)にアクセスするにはどうすればよいですか? ありがとう

答えて

18

。私は異なる設定で同じオブジェクトを読み込むためにptreeが必要で、イテレータが何を反復するか、どの型を返すか、オブジェクトレベルにとどまるかどうか、またはBFSのようなすべてのノードを通過するかどうかを調べることができませんでした。最後に、私は私のコードは次のような場合のために働いて得ることができた:

設定ファイル:

​​

まず、私はptreeでに初期化することができます私のオブジェクトのためのコンストラクタを追加しました。

object::object(const boost::property_tree::ptree &pt_) 
{ 
    enable = pt_.get<bool>("enable", true); // usage is: get<type>(path, default) 
    label = pt_.get<std::string>("label", "empty"); 
} 

最後に次のコードは、両方のオブジェクトをロードし、マップに配置します::私は失敗したのget()の上の例外を防ぐために、デフォルトのオプションを取得を使用していることに注意してください

std::map<std::string, my_object> objects_map; 

// parse settings file and add loggers 
if(filesystem::exists(logger_settings_file)) 
{ 
    boost::property_tree::ptree pt; 

    read_xml(logger_settings_file, pt); 
    BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt) 
    { 
     objects_map[v.first] = my_object(v.second); 
    } 
} 

だから、私自身の質問に答えるために:設定ファイルオーバー

  • イテレータ繰り返し処理を低いレベルに下降せず。上記のコードを実行すると、ループがXMLファイルの各オブジェクトに対して2回反復することがわかります。
  • イテレータは、ペアに似ており、firstsecondアクセサを持つvalue_typeオブジェクトを返します。 v.firstは親ノード(私の場合は "object1"、 "object2")を保持するstd ::文字列であり、v.secondboost::property_tree::ptreeであり、オブジェクトのフィールドを解析するために使用できます。
+0

ありがとうbavaza ...あなたの答えはより良いアプローチを説明した...私はそれが好きだった。ありがとうございます – Andry

+0

@Andry。歓声メイト。 – bavaza

0

入力プロパティファイルに関する事前知識が必要です。

ブーストプロパティツリーは、一般的なドキュメントパーサーではありません。それは解析を行い、データへのアクセスを与えますが、手動でそれを見つける必要があります。

ドキュメント全体をナビゲートする方法はありませんが、自分のファイルのプロパティが必要な場合は、非常に簡単なコードで行うことができます。 boost documentationから

1)スローバージョン(取得):

ptree pt; 
/* ... */ 
float v = pt.get<float>("a.path.to.float.value"); 

2)デフォルト値のバージョン(取得):

ptree pt; 
/* ... */ 
float v = pt.get("a.path.to.float.value", -1.f); 

3)オプションバージョン(get_optional):

ptree pt; 
/* ... */ 
boost::optional<float> v = pt.get_optional<float>("a.path.to.float.value"); 
19

印刷完全なツリー:私はAndryのに同意し、少なくとも非常に軽微なものとproperty_treeのドキュメントを見つける

void print(boost::property_tree::ptree const& pt) 
{ 
    using boost::property_tree::ptree; 
    ptree::const_iterator end = pt.end(); 
    for (ptree::const_iterator it = pt.begin(); it != end; ++it) { 
     std::cout << it->first << ": " << it->second.get_value<std::string>() << std::endl; 
     print(it->second); 
    } 
} 
+0

こんにちは、この記事の匿名の編集を拒否しました(コードが変更されたため)。あなたはそれをあなたの答えに組み込むべきかどうかを知るために[チェックアウトする](http://stackoverflow.com/suggested-edits/264840)をしたいかもしれません。 – Benjol

+0

@Benjol:tnx。私はそれを組み込んだので大丈夫でした。 –

関連する問題