我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?

Posted

技术标签:

【中文标题】我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?【英文标题】:How do we insert a boost ptree as a node in another boost ptree? 【发布时间】:2013-06-16 19:01:15 【问题描述】:

我想在 C++ 中序列化分层数据结构。我正在进行的项目使用 boost,所以我使用 boost::property_tree::ptree 作为我的数据节点结构。

我们有更高级别的结构,例如 Person,其中包含较低级别结构的实例,例如 Job(每个人都有一份工作)。 PersonJob 各自实现了一个 ptreeify 方法。这个想法是通过让每个对象在它包含的每个其他对象上调用ptreeify 来序列化层次结构。然后将生成的子对象的属性树作为节点插入到包含对象的属性树中。问题是我不知道如何实际插入。

跟随this SO post 会导致运行时错误。我缺乏了解导致它的原因所需的知识/经验。请参阅下面的代码。

我还找到了this very similar question,但我根本不明白答案,我怀疑使用insert 可以避免在那里发现的复杂情况。

问题:如何将一个属性树作为节点插入到另一个属性树中?

这是实际代码。运行时错误发生在Person::ptreeify内。

#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
using namespace std;

struct Job
    std::string title;
    int hoursPerWeek;
    ptree ptreeify(void); //return a ptree representing this Job
    ;

ptree Job::ptreeify()
    ptree pt;
    pt.put("title", title);
    pt.put("hours", hoursPerWeek);
    return pt;
    

struct Person
    std::string name;
    Job job;
    ptree ptreeify(void); //return a ptree representing this Person
                          //This must iterively call ptreeify on all sub-objects
    void save(const std::string &filename); //write this Person to file
    ;

ptree Person::ptreeify()
    ptree pt;
    pt.put("name", name);
    pt.put("job", "");

    ptree jobPt;
    jobPt = job.ptreeify();
    std::cout << "Program dies after this line" << std::endl;
    //This next line causes a run time error
    pt.insert(pt.get_child("job").begin(), jobPt.begin(), jobPt.end());
    return pt;
    

void Person::save(const std::string &filename)
    ptree pt;
    pt = ptreeify();
    write_json(filename, pt);
    ;

int main()
    Person myPerson;
    myPerson.name = "Julius";

    Job myJob;
    myJob.title = "monkey";
    myJob.hoursPerWeek = 40;

    myPerson.job = myJob;

    myPerson.save("myPerson.dat");
    

【问题讨论】:

【参考方案1】:

事实证明这真的很简单。你用put_child

ptree Person::ptreeify()
    ptree pt;
    pt.put("name", name);

    ptree jobPt;
    jobPt = job.ptreeify();
    pt.put_child("job", jobPt);
    return pt;
    

【讨论】:

以上是关于我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ptree(boost) 遍历 XML 文件中的同名子级?

如何使 boost ptree 以相同的方式解析 xml 和 json?

如何使用 boost ptree 删除 xml 属性?

boost ptree 即时修改一组值

boost::ptree 和 KeyCompare 函数?

如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML