I have the following XML file:
<?xml version="1.0" encoding="utf-8"?>
<gexf>
  <graph>
    <nodes>
      <node id="0" label="0" start="0" end="25"/>
      <node id="1" label="1" start="1"/>
      <node id="2" label="2" start="2"/>
      ...
    </nodes>
    <edges>
      <edge id="0" source="0" target="1" start="7" end="19"/>
      <edge id="1" source="0" target="2" start="8" end="20"/>
      ...
    </edges>
  </graph>
</gexf>
I want to remove the start and end attributes from the edge with source="0" and target="1".
The way I've tried to do this is in the following code. Assuming the XML file is named ptree_test.gexf I read it in, find the correct edge in the tree, and then attempt to use erase to get rid of the attributes.
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
using boost::property_tree::ptree;
int main(int argc, char *argv[]) {
  ptree pt;
  read_xml("ptree_test.gexf", pt);
  // Now find edge (0, 1) and delete the start and end attributes
  ptree edge;
  int id1, id2;
  id1 = 0;
  id2 = 1;
  for(auto &e : pt.get_child("gexf.graph.edges")) {
    int s, t;
    s = e.second.get<int>("<xmlattr>.source");
    t = e.second.get<int>("<xmlattr>.target");
    // Check if this is the correct edge
    // Two checks because it can be reversed
    if((id1 == s && id2 == t) || (id1 == t && id2 == s)) {
      edge = e.second;
      break;
    }
  }
  for(auto & attr : edge.get_child("<xmlattr>")) {
    if(attr.first == "end" || attr.first == "start") {
      edge.erase(attr.first);
    }
  }
  write_xml(std::cout, pt);
  return 0;
}
This does not work. It doesn't remove the attribute. In fact, if I put in a debug statement that prints the return of edge.erase(attr.first) it shows 0.
 
     
     
     
    