繁体   English   中英

有没有一种方便的方法从属性树中删除节点,保留其子节点?

[英]Is there a convenient way to erase a node from a property tree, preserving its child nodes?

我想从boost属性树中删除一个节点,但我想保留它的子节点并将它们连接到已删除节点的父节点(即它们的祖父节点)。 有一种优雅的方式来实现这一目标吗?

这可能是移动孙子孙女的最有效方式:

std::move(middle.begin(), middle.end(), back_inserter(parent));

完整样本

住在Coliru

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

using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;

int main() {

    std::istringstream iss(R"({ "a" : { "middle" : { "a1":1, "a2":2, "a3":3 }, "more":"stuff" } })");
    ptree pt;
    read_json(iss, pt);

    auto& parent = pt.get_child("a");
    auto& middle = pt.get_child("a.middle");

    std::move(middle.begin(), middle.end(), back_inserter(parent));
    parent.erase("middle");

    write_json(std::cout, pt);

}

示例json输出:

{
    "a": {
        "more": "stuff",
        "a1": "1",
        "a2": "2",
        "a3": "3"
    }
}

我不得不做类似的事情。

我使用了一个带递归的迭代器,并在删除节点并将其分支回新创建的节点之前复制了子节点。

但我想在删除之前每棵树的完整副本都是非常耗费资源的,所以你只能用相对较小的树来做它并不是很优雅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM