Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boost property tree: Remove a node

How would you remove a node from boost xml property tree?

I have a document like this:

<folders>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
</folders>

I know how to itereate and print all folders, but how would i remove one of the items and save the xml back?

like image 491
Rasmus Styrk Avatar asked Jun 15 '12 09:06

Rasmus Styrk


2 Answers

I would probably try:

boost::property_tree::ptree pt;

pt.erase(key);
like image 135
yosoy89 Avatar answered Sep 19 '22 16:09

yosoy89


void Backups::removeGeneric(const std::string key, const std::string value)
{
    typedef boost::property_tree::ptree Tree;

    Tree pt;
    boost::property_tree::xml_parser::read_xml(Backups::getBackupFile(), pt);

    std::pair< Tree::assoc_iterator, Tree::assoc_iterator> range = pt.equal_range(key);
    if(range.first == pt.not_found())
    {  
        std::cout << "There is nothing to remove." << std::endl;
    }
    else
    {
        bool removed = false;

        do
        {  
            if(assoc_i->second.data() == value) {
                Tree::iterator i = pt.to_iterator(assoc_i);
                pt.erase(i);
                removed = true;
                // not sure if this is completely necessary - trying
                // to guard against invalidating the iterator
                // via erase - if removed, remember to ++i!
                range = pt.equal_range(key);
                i = range.first;
            }
            else
                ++i;
         } while(i != pt.not_found());

         if(removed)
         {
             boost::property_tree::xml_parser::write_xml(Backups::getBackupFile(), pt);
             std::cout << value << " was removed." << std::endl;
         }
         else
             std::cout << value << " is not added." << std::endl;
    }
}
like image 38
sje397 Avatar answered Sep 22 '22 16:09

sje397