访问 child XML 元素 Python lxml
Accessing child XML elements in Python lxml
我正在尝试编写一些代码来删除 xml 文件中的特定节点。
我希望代码根据 parents 和 children 的属性删除特定节点。
我想删除 <ParameterGroup>
个节点,其 parents 是 <Task>
个具有 name="Parameter Estimation"
的节点,并且具有 children <Parameter>
个具有 name="Parameter Estimation"
的节点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 是错误的。
这里是 link 到有问题的 xml 文件:https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0
这里是相关部分的片段:
<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>
节点下的子元素;这不起作用(它给出零输出):
for a in parsed.xpath("//c:Task[@name='Parameter Estimation']/ParameterGroup[@name='FitItem']", namespaces=NSMAP):
print a.attrib['name']
您应该在组合的 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']/......
我正在尝试编写一些代码来删除 xml 文件中的特定节点。
我希望代码根据 parents 和 children 的属性删除特定节点。
我想删除 <ParameterGroup>
个节点,其 parents 是 <Task>
个具有 name="Parameter Estimation"
的节点,并且具有 children <Parameter>
个具有 name="Parameter Estimation"
的节点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 是错误的。
这里是 link 到有问题的 xml 文件:https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0
这里是相关部分的片段:
<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>
节点下的子元素;这不起作用(它给出零输出):
for a in parsed.xpath("//c:Task[@name='Parameter Estimation']/ParameterGroup[@name='FitItem']", namespaces=NSMAP):
print a.attrib['name']
您应该在组合的 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']/......