我正在尝试编写一些代码来删除xml文件中的特定节点。
我希望代码根据父母和孩子的属性删除特定节点。
我想要删除父级为<ParameterGroup>
个节点<Task>
的{{1}}个节点,以及name="Parameter Estimation"
个节点<Parameter>
的节点。
在这种情况下,value="some_string"
值为:"some_string"
我编写了一个"CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"
循环,允许我访问我想要删除的特定节点,但是当我尝试组合成一个路径时,它不起作用。
for
上面的代码访问正确的子元素。但是,我想将这三个级别合并为一个路径,以便我可以删除from lxml import etree
NSMAP = {"c": "http://www.copasi.org/static/schema"}
parsed = etree.parse('ct.cps')
for task in parsed.xpath("//c:Task[@name='Parameter Estimation']", namespaces=NSMAP):
for group in task.xpath(".//c:ParameterGroup[@name='FitItem']", namespaces=NSMAP):
for parameter in group.xpath(".//c:Parameter[@value='CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value']", namespaces=NSMAP):
print parameter.attrib['name']
节点。
这样的事情:
<ParameterGroup>
但每当我尝试或类似时,我得到零输出或错误声明xpath是错误的。
以下是相关xml文件的链接:https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0
以下是相关部分的摘录:
for a in parsed.xpath("//c:Task[@name='Parameter Estimation']/ParameterGroup[@name='FitItem']/Parameter[@value='CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value']", namespaces=NSMAP):
parsed.remove(a)
编辑:我甚至无法访问<Task key="Task_19" name="Parameter Estimation" type="parameterFitting" scheduled="false" updateModel="true">
<Report reference="Report_12" target="" append="1" confirmOverwrite="1"/>
<Problem>
<Parameter name="Maximize" type="bool" value="0"/>
<Parameter name="Randomize Start Values" type="bool" value="0"/>
<Parameter name="Calculate Statistics" type="bool" value="1"/>
<ParameterGroup name="OptimizationItemList">
<ParameterGroup name="FitItem">
<ParameterGroup name="Affected Cross Validation Experiments">
</ParameterGroup>
<ParameterGroup name="Affected Experiments">
</ParameterGroup>
<Parameter name="LowerBound" type="cn" value="1e-06"/>
<Parameter name="ObjectCN" type="cn" value="CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"/>
<Parameter name="StartValue" type="float" value="433.724"/>
<Parameter name="UpperBound" type="cn" value="1e+03"/>
</ParameterGroup>
<ParameterGroup name="FitItem">
<ParameterGroup name="Affected Cross Validation Experiments">
节点下的子元素;这不起作用(它给出零输出):
<Task>
答案 0 :(得分:1)
您应该在组合的XPath中使用相同的//
轴而不是/
,以形成代码的嵌套for
版本的精确翻译:
//c:Task[@name='Parameter Estimation']//c:ParameterGroup[@name='FitItem']//c:Parameter[@value='bla..bla..']
使用/
轴不起作用主要是因为ParameterGroup
不是Task
的直接子。在从ParameterGroup
Task
之前,您还有一个其他级别
//c:Task[@name='Parameter Estimation']/*/c:ParameterGroup[@name='FitItem']/......