C ++ boost ptree重命名密钥

时间:2017-07-23 07:29:03

标签: c++ boost boost-propertytree ptree

在提升属性树中,我想将a.b.c2等关键字重命名为a.b.c3

一种方法是删除节点并将其副本放在另一个名称中。问题是节点位于其他兄弟节点的末尾。我更喜欢保留订单。我该如何修复此代码?

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/algorithm/string/predicate.hpp>

using namespace boost::property_tree;

void print(const ptree &p)
{
    json_parser::write_json(std::cout, p);
}

int main()
{
    ptree pt0;

    pt0.put("a.b.c1",4);
    pt0.put("a.b.c2.e1",4);
    pt0.put("a.b.c4",2);
    pt0.put("a.d",4);
    pt0.put("k.m",4);
    pt0.put("k.n.as",4);

    std::string key_parent="a.b";
    std::string full_key="a.b.c2";
    std::string full_key2="a.b.c3";
    ptree node=pt0.get_child(full_key);
    pt0.get_child(key_parent).erase("c2");
    pt0.put_child(full_key2,node);

    print(pt0);

    return 0;
}

结果:(

// before:
{
    "a": {
        "b": {
            "c1": "4",
            "c2": {
                "e1": "4"
            },
            "c4": "2"
        },
        "d": "4"
    },
    "k": {
        "m": "4",
        "n": {
            "as": "4"
        }
    }
}


// after:
{
    "a": {
        "b": {
            "c1": "4",
            "c4": "2",
            "c3": {
                "e1": "4"
            }
        },
        "d": "4"
    },
    "k": {
        "m": "4",
        "n": {
            "as": "4"
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用insertiterator来执行此操作。

ptree &child = pt0.get_child("a.b");
ptree::iterator it = child.to_iterator(child.find("c2"));
child.insert(it, make_pair("c3", it->second));
child.erase(it);