首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问Python中的子XML元素

访问Python中的子XML元素
EN

Stack Overflow用户
提问于 2015-07-11 14:24:38
回答 1查看 606关注 0票数 0

我试图编写一些代码来删除xml文件中的特定节点。

我希望代码能够根据其父节点和子节点的属性删除特定节点。

我想删除<ParameterGroup>节点,这些节点的父节点是带有name="Parameter Estimation"<Task>节点,并且具有带有value="some_string"的子<Parameter>节点。

本例中的"some_string"值是:"CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"

我已经编写了一个for循环,它允许我访问我想要删除的特定节点,但是当我试图组合成一条路径时,它就不能工作了。

代码语言:javascript
复制
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>节点。

就像这样:

代码语言:javascript
复制
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)

但是,每当我尝试这样做或类似的时候,我都会得到零输出或一个错误,说明xpath是错误的。

下面是到所讨论的xml文件的链接:https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0

下面是相关部分的片段:

代码语言:javascript
复制
<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>节点下面的子元素;这不起作用(它提供零输出):

代码语言:javascript
复制
for a in parsed.xpath("//c:Task[@name='Parameter Estimation']/ParameterGroup[@name='FitItem']", namespaces=NSMAP):
    print a.attrib['name']
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-11 14:38:20

您应该在组合的//中使用相同的/轴而不是/来形成代码嵌套for版本的精确转换:

代码语言:javascript
复制
//c:Task[@name='Parameter Estimation']//c:ParameterGroup[@name='FitItem']//c:Parameter[@value='bla..bla..']

使用/轴不起作用,主要是因为ParameterGroup不是Task的直接子级。在从ParameterGroup进入Task之前,您还有另外一个级别:

代码语言:javascript
复制
//c:Task[@name='Parameter Estimation']/*/c:ParameterGroup[@name='FitItem']/......
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31358151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档