2017-02-24 66 views
2

我试图将一个boost :: property_tree :: ptree的元素传递给一个函数。 详细地说,我必须从中ptree中被初始化下面的XML代码:boost :: property_tree传递子树,包括<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> 

我想通过它的一部分到一个函数。基本上,我想通过:

<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