Boost Property_Tree迭代器,如何处理它们?

And*_*dry 14 c++ iterator boost-propertytree

对不起,之前我问了一个关于同一主题的问题,但是我的问题涉及那里描述的另一个方面(如何迭代一个提升...).

看看下面的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

好吧,正如我在上面提到的问题中告诉我的那样,有可能property_tree在Boost中使用迭代器,但我不知道它是什么类型,以及我可以使用哪些方法或属性.

好吧,我认为它必须是另一个ptree或代表另一个xml层次结构的东西再次浏览(如果我想),但关于这个的文档是非常糟糕的.我不知道为什么,但在boost docs中我找不到什么好东西,只是关于浏览节点的宏,但这种方法是我真的想避免的.

所以在这里提出我的问题:一旦获得了it的迭代器ptree,我如何访问节点名称,值,参数(xml文件中的节点)?谢谢

And*_*hko 19

打印完整的树:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


bav*_*aza 18

我同意Andry的观点,并且发现property_tree的文档至少是极少的.我需要ptree来加载具有不同设置的相同对象,并且无法确定迭代器迭代的内容,返回的类型,以及它是否将保留在对象级别,或者通过每个节点类似BFS.最后,我设法让我的代码适用于类似于以下的案例:

设置文件:

<object1>
    <enable>true</enable>
    <label>hello</label>
</object1>
<object2>
    <enable>false</enable>
    <label>goodbye</label>
</object2>
Run Code Online (Sandbox Code Playgroud)

首先,我为我的对象添加了一个构造函数,它可以在ptree上初始化.请注意,我使用get with default选项,以防止get()失败时出现异常:

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");
}
Run Code Online (Sandbox Code Playgroud)

最后,以下代码加载两个对象,并将它们放在一个映射中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,回答我自己的问题:

  • 迭代器迭代设置文件而不会降低到较低级别.运行上面的代码,你会发现循环迭代两次 - 对于XML文件中的每个对象一次.
  • 迭代器返回一个类似于一对的value_type对象,并具有firstsecond访问器.v.first是一个std :: string,它包含父节点(在我的例子中是"object1","object2"),并且v.second是一个boost::property_tree::ptree,可以用来解析对象的字段.