python - Removing specific elements from XML using Etree -


i'm trying use element tree locate element of interest xml , remove entire group (i.e. parent) xml.

import xml.etree.elementtree et lxml import etree   copasiml_str= ia.read_copasiml_as_string(model_file) # reads xml string copasiml=et.fromstring(copasiml_str) # parse xml etree  in copasiml.findall(".//*[@name='objectcn']"): # locate element      if '[v18]' in  i.attrib['value']:           #search 'v18'          if 'parameter=v' in i.attrib['value']:   #search 'parameter=v'             print i.attrib['value']             #element identified             parent = i.getparent()   #gets parent of identified             copasiml.remove(parent) # not work 

this code identifies element , gets parent of element want remove. gives me error when try remove element:

valueerror: element not child of node. 

the xml in question complicated. here snippet:

<parametergroup name="fititem">             <parametergroup name="affected cross validation experiments">             </parametergroup>             <parametergroup name="affected experiments">               <parameter name="experiment key" type="key" value="experiment_1"/>               <parameter name="experiment key" type="key" value="experiment_2"/>               <parameter name="experiment key" type="key" value="experiment_4"/>             </parametergroup>             <parameter name="lowerbound" type="cn" value="1e-06"/>             <parameter name="objectcn" type="cn" value="cn=root,model=noname,vector=reactions[v18],parametergroup=parameters,parameter=v,reference=value"/>             <parameter name="startvalue" type="float" value="0.1852208634119804"/>             <parameter name="upperbound" type="cn" value="100"/>           </parametergroup> 

there many 'fititem' parameter groups. i'm trying locate 1 '[v18]' , 'parameter=v' , delete entire fititem. know how this?

thanks

if xml posted part of larger xml , <parametergroup name="fititem"> isn't root element, should able remove element referenced parent variable it's parent (don't confused) :

...... parent = i.getparent() parent.getparent().remove(parent) 

otherwise, can't remove parent because references root element, , xml document requires 1 root element stay qualified xml.

this working example demo :

from lxml import etree  xml = '''<root>     <parametergroup name="fititem">             <parametergroup name="affected cross validation experiments">             </parametergroup>             <parametergroup name="affected experiments">               <parameter name="experiment key" type="key" value="experiment_1"/>               <parameter name="experiment key" type="key" value="experiment_2"/>               <parameter name="experiment key" type="key" value="experiment_4"/>             </parametergroup>             <parameter name="lowerbound" type="cn" value="1e-06"/>             <parameter name="objectcn" type="cn" value="cn=root,model=noname,vector=reactions[v18],parametergroup=parameters,parameter=v,reference=value"/>             <parameter name="startvalue" type="float" value="0.1852208634119804"/>             <parameter name="upperbound" type="cn" value="100"/>           </parametergroup> </root>''' copasiml=etree.fromstring(xml) query = "//*[@name='objectcn'][contains(@value,'[v18]')][contains(@value,'parameter=v')]" in copasiml.xpath(query):     parent = i.getparent()     parent.getparent().remove(parent)  print etree.tostring(copasiml) 

output :

<root>     </root> 

Comments