提升属性树获取第一个元素
Posted
技术标签:
【中文标题】提升属性树获取第一个元素【英文标题】:boost property tree getting first element 【发布时间】:2012-11-23 15:03:32 【问题描述】:我想知道是否有一些方便的方法可以使用路径方法访问列表的已知索引。
我的梦想方法
float v = pt.get<float>("root.list[0]);
当前已知的方法(或类似的方法)
ptree::value_type listElement;
BOOST_FOREACH(listElement,tree.get_child("root.list"))
return listElement.second.get<float>();
列表格式(json)
root:
list:[1,2,3,4,5]
【问题讨论】:
您的property_tree
数据的格式是什么?您是否有多个具有相同键的元素?例如如果表示为 xml,是否采用以下格式:<root><list>val1</list><list>val2</list><list>val3</list><list>val4</list><root>
?
添加格式,不只有一个元素有key,要idx 0
【参考方案1】:
您应该能够使用boost::property_tree::equal_range
访问列表中的元素范围。使用您使用的 JSON 格式,列表中的每个项目都没有关联的名称元素。这意味着在访问范围内的子元素之前,必须先获取父节点。
下面的代码是一个粗略的例子,你可以修改:
输入Json文件(in.json):
"root" :
"list" : [1,2,3,4,5]
打印列表第n个元素的函数:
void display_list_elem( const ptree& pt, unsigned idx )
// note: the node elements have no name value, ergo we cannot get
// them directly, therefor we must access the parent node,
// and then get the children separately
// access the list node
BOOST_AUTO( listNode, pt.get_child("root.list") );
// get the children, i.e. the list elements
std::pair< ptree::const_assoc_iterator,
ptree::const_assoc_iterator > bounds = listNode.equal_range( "" );
std::cout << "Size of list : " << std::distance( bounds.first, bounds.second ) << "\n";
if ( idx > std::distance( bounds.first, bounds.second ) )
std::cerr << "ERROR Index too big\n";
return;
else
std::advance( bounds.first, idx );
std::cout << "Value @ idx[" << idx << "] = "
<< bounds.first->second.get_value<std::string>() << "\n";
std::cout << "Displaying bounds....\n";
display_ptree( bounds.first->second, 10 );
【讨论】:
以上是关于提升属性树获取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章