Search code examples
c++boostboost-propertytreesubtree

How to copy subtree from Boost.PropertyTree


I have some boost::property_tree::ptree. I need tree with removing some elements with certain tag name. For example, xml for source ptree is the following:

<?xml version="1.0" encoding="utf-8"?>
<document>
  <B atr="one" atr1="something">
    <to_remove attr="two">10</to_remove>
  </B>
  <to_remove>
    <C>value</C>
    <D>other value</D>
  </to_remove>
  <E>nothing</E>
</document>

And I'd like to get ptree with xml like the following:

<?xml version="1.0" encoding="utf-8"?>
<document>
  <B atr="one" atr1="something" />
  <E>nothing</E>
</document>

How to write function, that generate new ptree with removed <to_remove> nodes?


Solution

  • The value_type of ptree is std::pair< const Key, self_type >, so you can iterate the tree and remove corresponding nodes. The following is a sample.

    void remove(ptree &pt){
    using namespace boost::property_tree;
        for (auto p = pt.begin(); p != pt.end();){
            if (p->first == "to_remove"){
                p = pt.erase(p);
            }
            else{
                remove(p->second);
                ++p;
            }
        }
    }