Search code examples
c++boostboost-propertytree

Boost property tree: Remove a nested node


Suppose I have the following tree:

boost::property_tree::ptree tree;
tree.add("1.2.3", "value-1");
tree.add("1.2.3.4", "nested-value");
tree.add("1.2.3", "value-2");
tree.add("1.2.33", "other-value");

which has the following serialized INFO form:

1
{
    2
    {
        3 value-1
        {
            4 nested-value
        }
        3 value-2
        33 other-value
    }
}

Is there a method to remove all nodes having a provided (possibly nested) path? I.e.:

remove(tree, "1.2.3");
BOOST_ASSERT(!tree.get_optional<std::string>("1.2.3") && 
             !tree.get_child_optional("1.2.3"));

with the result INFO form:

1
{
    2
    {
        33 other-value
    }
}

Looking at ptree docs and source code I've found several methods to remove immediate children of a tree (nested children are not accounted). Also, there are several methods to get a subtree by it's full path (even if it is nested). But since there is no way to easily get node's parent, I could not combine all these to get what I need.

Is there any easy way to get what I need, possibly w/o the need to reimplement tree traversal?


Solution

  • I don't think it can be done. It would be kind-a ok in JSON, but with INFO subtree keys can be repeated at each level, making it important to traverse all of the tree

    Perhaps this answer helps to get started: How to iterate over XML structure in boost::property_tree

    Be very careful about iterating a tree that's being modified, though. You will want to double check the iterator invalidation rules in the documentation for erase