2017-02-24 5 views
2

boost :: property_tree :: ptreeの要素を関数に渡そうとしています。具体的には 、Iはptreeでは、初期化された次のXMLコードを有する:boost :: property_tree with subtree with <xmlattr>

<Master Name='gamma'> 
    <Par1 Name='name1'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par1> 
    <Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 
</Master> 

I関数にその一部を通過したいです。基本的に私は渡したい:

<Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 

関数は次のようになります。一般的には

void processTree(which_type_do_I_put_here element){ 
    std::string n = element.get<std::string>("<xmlattr>.Name"); 
    double val = element.get<double>("Value"); 
} 

私はptree::get_child("par2")を使用してサブツリーを渡すことができます。これには、このノードの<xmlattr>へのアクセスがないという欠点があります。

<xmlattr>へのアクセス権を持つツリーのこの部分をどうやって渡すことができますか? 事前にアイデアをお寄せいただきありがとうございます。

〜ピーター・

+0

」は特別なものではなく、単なる子ツリーです。したがって、 'get_child(" par2 ")'は単に子ツリーを持つツリーを返します()。 – zett42

答えて

3

タイプはptreeです。

一般に、ptree :: get_child( "par2")を使用してサブツリーを渡すことができます。

実際。

Live On Coliru

#include <boost/property_tree/xml_parser.hpp> 
#include <iostream> 

std::string const sample = R"(
<Master Name='gamma'> 
    <Par1 Name='name1'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par1> 
    <Par2 Name='name2'> 
     <Value>0.</Value> 
     <Fix>1</Fix> 
    </Par2> 
</Master> 
)"; 

using boost::property_tree::ptree; 

void processTree(ptree const& element) { 
    std::string n = element.get<std::string>("<xmlattr>.Name"); 

    double val = element.get<double>("Value"); 
    std::cout << __FUNCTION__ << ": n=" << n << " val=" << val << "\n"; 
} 

int main() { 
    ptree pt; 
    { 
     std::istringstream iss(sample); 
     read_xml(iss, pt); 
    } 

    processTree(pt.get_child("Master.Par2")); 
} 

出力します:

これは権利ではない関数は、このノード

のにアクセスできないという欠点を有している

processTree: n=name2 val=0 
+0

魅力的な作品です。私は前にこれを実装しようとしましたが、それがうまくいかなかったことを思い出さないいくつかの理由がありました。どうもありがとう! – hansgans

関連する問題