我想寫一些代碼來刪除xml文件中的特定節點。在Python中訪問子元素XML lxml
我希望代碼根據父母和孩子的屬性刪除特定的節點。
我想刪除<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
環路授予我訪問,我想刪除特定的節點,但是當我試圖合併成一個路徑它不工作。
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
,這裏是從相關的部分片段:
<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']
當然,非常感謝!我現在感覺有點傻... – Charon