【发布时间】:2015-07-11 14:24:19
【问题描述】:
我正在尝试使用元素树从 XML 中定位感兴趣的元素,并从 XML 中删除整个组(即父组)。
import xml.etree.ElementTree as ET
from lxml import etree
copasiML_str= IA.read_copasiML_as_string(model_file) # Reads XML as string
copasiML=ET.fromstring(copasiML_str) # parse XML to etree
for i in copasiML.findall(".//*[@name='ObjectCN']"): # locate element
if '[v18]' in i.attrib['value']: #search for 'v18'
if 'Parameter=V' in i.attrib['value']: #search for 'Parameter=V'
print i.attrib['value'] #Element identified
parent = i.getparent() #gets the parent of identified
copasiML.remove(parent) # This does not work
此代码标识元素并获取我要删除的元素的父元素。然后当我尝试删除元素时它给了我一个错误:
ValueError: Element is not a child of this node.
有问题的 XML 相当复杂。这是一个sn-p:
<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>
有许多“FitItem”参数组。我正在尝试使用“[V18]”和“Parameter=V”找到那个并删除整个 FitItem。有人知道该怎么做吗?
谢谢
【问题讨论】:
-
抱歉,粘贴错误。根称为 copasiML。
-
鉴于该示例 XML,
*[@name='ObjectCN']的父元素是根元素,这意味着您正在尝试删除整个 XML,这将使其不是格式良好的 XML -
请重新检查,我怀疑在实际代码中您使用
lxml(etree.fromstring()或类似)代替填充copasiML变量,因为内置ElementTree没有方法@ 987654329@
标签: python xml elementtree