【问题标题】:Accessing child XML elements in Python lxml在 Python lxml 中访问子 XML 元素
【发布时间】:2015-07-11 14:24:38
【问题描述】:

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

我希望代码根据父子属性删除特定节点。

我想删除父节点为 <Task> 的节点为 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> 节点。

类似这样的:

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

这是来自相关部分的 sn-p:

<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">

编辑:我什至无法访问&lt;Task&gt; 节点下的子元素;这不起作用(它给出零输出):

for a in parsed.xpath("//c:Task[@name='Parameter Estimation']/ParameterGroup[@name='FitItem']", namespaces=NSMAP):
    print a.attrib['name']

【问题讨论】:

    标签: python xml python-2.7 xpath lxml


    【解决方案1】:

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

    //c:Task[@name='Parameter Estimation']//c:ParameterGroup[@name='FitItem']//c:Parameter[@value='bla..bla..']
    

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

    //c:Task[@name='Parameter Estimation']/*/c:ParameterGroup[@name='FitItem']/......
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2015-09-22
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多