Loops boost:只需迭代ptree的元素

Loops boost:只需迭代ptree的元素,loops,boost-propertytree,Loops,Boost Propertytree,这应该很简单(我只是在学习boost,所以我遗漏了一些东西) 我已经使用JSON_read阅读了一些简单的JSON,现在有了一个ptree。web上的所有示例都使用ptree.get(“entry_name”)来获取条目。我想做的就是: ptree pt; read_json(ss,pt); BOOST_FOREACH(ptree::value_type &v, pt) { std::cout << v.{entry_name} << v.{val

这应该很简单(我只是在学习boost,所以我遗漏了一些东西)

我已经使用JSON_read阅读了一些简单的JSON,现在有了一个ptree。web上的所有示例都使用ptree.get(“entry_name”)来获取条目。我想做的就是:

 ptree pt;
 read_json(ss,pt);

 BOOST_FOREACH(ptree::value_type &v, pt)
 {
   std::cout << v.{entry_name} << v.{value}
 }
ptree-pt;
读json(ss,pt);
BOOST_FOREACH(ptree::value_type&v,pt)
{

std::cout我在使用ptree时也遇到了问题,但这可能会有所帮助: 退房

v、 {entry_name}
将是
v、 首先

v、 {value}
v、 第二,数据()


这行得通吗?

我在搜索同一个东西,但在任何地方都找不到答案。事实证明,答案非常简单:

ptree pt;
/* load/fill pt */
for(iterator iter = pt.begin(); iter != pt.end(); iter++)
{
  std::cout << iter->first << "," << iter->second.data() << std::endl;
}
ptree-pt;
/*装载/填充点*/
for(迭代器iter=pt.begin();iter!=pt.end();iter++)
{
std::cout first second.data()
是第一级的输入值。(然后可以使用
iter->second.begin()
/
end()
重新迭代以获得更深层次。)

此外,如果此迭代中的一个这样的节点不是终端节点,并且本身是ptree,则可以从该迭代器本身获得ptree:
ptree subPt=iter->second.get_child(“nodeName”);

下面是一个使用BOOST\u FOREACH迭代ptree的好例子

对于使用普通“get”函数的直接访问,请参见boost中的示例:

文档页面位于此处:
我知道它没有很好的文档记录,但它很有帮助。

这个示例迭代一个简单的JSON对象,并将其值放入一个向量中

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/lexical_cast.hpp>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int main (void)
{   
    try
    {        
        std::stringstream ss;
        std::string json_obj_str = "{ \"unit_1\": 1, \"unit_2\": 2, \"unit_3\": 3 }";
        std::vector <float> fvec;

        ss << json_obj_str; // put string into stringstream

        boost::property_tree::ptree pt;
        boost::property_tree::read_json(ss, pt);    // put stringstream into property tree

        // iterate over JSON properties
        for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++)
        {
            std::cout << iter->first << ": " << iter->second.data() << std::endl;
            fvec.push_back(boost::lexical_cast<float>(iter->second.data()));
        }

        for (size_t i = 0; i < fvec.size(); i++)
        {
            std::cout << "fvec.at(" << i << ") = " << fvec.at(i) << std::endl;
        }
    }
    catch (const boost::property_tree::ptree_error &e)
    {
        std::cerr << "property_tree error = " << e.what() << std::endl;
        return -2;
    }       
    catch (std::exception const& e)
    {
        std::cerr << "exception = " << e.what() << std::endl;
        return -1;
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{   
尝试
{        
std::stringstream-ss;
std::string json_obj_str=“{\'unit_1\':1,\'unit_2\':2,\'unit_3\':3}”;
std::载体fvec;

ss旧线程,但这里有一个C++11版本的answer,带有基于范围的for循环:

ptree pt;
/* load/fill pt */
for(auto pair : pt)
{
  std::cout << pair.first << "," << pair.second.data() << std::endl;
}
它输出:

key1,value1
key2,value2

这是一篇老文章,现在评论已经太迟了,但是如果iter->second.data()呢是数组,这段代码不起作用,不是吗?是的,但是如果你读了代码下面的文字,它会解释如何处理非终端。我无法让代码下面的文字在更深层的ptree中起作用。我遗漏了一些东西或者没有正确理解它。@Dan:你能详细说明一下,什么不起作用?你试过什么吗?如果需要的是,你可以开始一个新的问题。这一点无关紧要。我的问题本质上只是一个加载问题。我只是想了解一下boost::ptree,看看它是否能满足我的需要。如果不能,我需要能够对大而复杂的XML文件进行XSL,以便使用bulkinsert将其转储到数据库中。我已经尝试了服务器如果您有任何关于加载和XSL转换XML的非VS建议,我洗耳恭听。
key1,value1
key2,value2