在Python中访问子XML元素lxml

时间:2015-07-11 14:24:39

标签: python xml python-2.7 xpath lxml

我正在尝试编写一些代码来删除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>

1 个答案:

答案 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']/......