2015-07-11 113 views
0

我想寫一些代碼來刪除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'] 

回答

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']/...... 
+0

當然,非常感謝!我現在感覺有點傻... – Charon