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
Post a Comment