2014-03-02 39 views
1

我的代碼似乎出現了一個值錯誤,我不知道爲什麼。用ET刪除Python中的元素

ValueError: list.remove(x): x not in list 

當我使用一個print語句我似乎找到日誌設置正確,因爲它打印我希望看到的位置和數量。我只是不確定爲什麼我不能刪除它。

XML 
... 
<security> 
    <rules> 
     <entry name="blah"> 
      <log-setting> log-forwarding-main 

這裏是兩個scipts我曾嘗試

import xml.etree.ElementTree as ET 
tree = ET.parse('filelocation') 
rules = tree.findall('.//security/rules/entry') 

for rem_rule in rules: 
    log = rem_rule.findall('log-setting') 
    rem_rule.remove(log) 
tree.write('newfilelocation') 

並試用了此每一個不同的崗位

import xml.etree.ElementTree as ET 
tree = ET.parse('filelocation') 
rules = tree.findall('.//security/rules/entry') 

for rem_rule in rules[:]: 
    for rem_rule in rules[:]: 
     log = rem_rule.findall('log-setting') 
     rem_rule.remove(log) 
tree.write('newfilelocation') 

回答

2

根據文檔xml.etree.ElementTree.Element有一個功能.remove(subelement)。但是,.findall()將返回一個列表。因此,將rem_rule.remove(log)替換爲:

for element in log: 
    rem_rule.remove(element) 

解決了這個問題。你的完整片段看起來像

import xml.etree.ElementTree as ET 
tree = ET.parse('test.xml') 
rules = tree.findall('.//security/rules/entry') 

for rem_rule in rules: 
    log = rem_rule.findall('log-setting') 
    for element in log: 
     rem_rule.remove(element) 
tree.write('newtest.xml') 
+0

這工作就像一個魅力,謝謝幫助noob出來。根本不是一個編碼器,但是這爲我未來的任務節省了很多時間。 – user2891632