0

我正在使用 elementtree/lists 编辑标签,在从配置标签中获取信息后,我想删除标签。我尝试在下面这样做i.remove(j),如果我遍历列表列表,我可以看到确实删除了该配置标记。但是,当我写出文件时它们仍然存在,为什么会这样,我该如何删除它们?是不是我正在编辑一个子列表,然后将另一个列表写入文件?

import xml.etree.ElementTree as ET
ET.register_namespace("", "http://clish.sourceforge.net/XMLSchema")
tree = ET.parse('ethernet.xml')
root = tree.getroot()

command= ""
pattern = ""
operation = ""
priority= ""

action_command = """/klas/klish-scripts/ifrange.py run_command --cmdrange "${interface_method} ${iface_num} ${range_separator} ${iface_num2}  ${range_separator2} ${interface_method2} ${iface_num3} ${range_separator3} ${iface_num4} ${range_separator4} ${interface_method3} ${iface_num5} ${range_separator5} ${iface_num6} ${range_separator6} ${interface_method4} ${iface_num7} ${range_separator7} ${iface_num8}" --command "%s" --klish_config "%s" --klish_action "%s" --priority "%s"
"""

commands = root.findall('{http://clish.sourceforge.net/XMLSchema}'
                        'VIEW/{http://clish.sourceforge.net/XMLSchema}COMMAND')
all1 = []

for command in commands:
    all1.append(list(command.iter()))

atr = ""
for i in all1:
    for j in i:
        if "COMMAND" in j.tag:
            if "name" in j.attrib:
                pattern = j.attrib['name']
                #print operation
        if "CONFIG" in j.tag:
            if "operation" in j.attrib:
                operation = j.attrib['operation']  
            else:
                operation = "set"  
            if "pattern" in j.attrib:
                pattern = j.attrib['pattern']                       
            if "priority" in j.attrib:
                priority = j.attrib['priority']
            else:
                if operation == "unset":
                    priority = ""
                else:
                    priority = "0x7f00"    

            atr = str(j.attrib)
            **i.remove(j)**

        if "ACTION" in j.tag: 
            if j.text:
                command = j.text.strip()
                j.text= action_command % (command, pattern, operation, priority)
            else:
                command = ""                        

cmd = ""
cmd += ifrange  


for o in all1:
    for y in o:
        print y
    **cmd += ET.tostring(o[0], encoding="utf-8", method="xml")**
cmd += end_tags


f = open('Z2.xml', 'w')
f.write(cmd)
f.close

编辑:解决方案,在我写入文件之前,在文件末尾我重置all1为 []。然后我循环遍历树,删除必要的元素。

all1 = []
for command in commands:
    for i in command:
         #print i
         if "CONFIG" in str(i):
             command.remove(i)
    all1.append(list(command.iter()))
4

1 回答 1

1

您只是从列表中删除对元素的引用。您需要改为调用.remove()父元素。ElementTree 不保留父指针;仅给定一个CONFIG元素,您不能返回作为VIEW其父元素的元素。

这意味着您还需要保留对父级的引用。循环遍历VIEW元素,然后在嵌套循环中找到CONFIG要删除的元素,并且在VIEW父元素仍然可用的情况下,调用.remove()以从该父元素中删除子元素。

于 2013-07-08T15:40:45.403 回答