2013-07-08 2 views
0

Я редактирую теги с помощью elementtree/lists, а после получения информации из тегов конфигурации я хочу удалить тег. Я пытаюсь сделать это ниже с i.remove(j), и если я прокручу список списков, я вижу, что действительно этот тег конфигурации удален. Однако, когда я пишу в файл , они все еще там, почему это, как их удалить? Это то, что я редактирую подсписку, а затем записываю другой список в файл?удалить элемент из elementtree/list

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())) 

ответ

1

Вы удаляете ссылки на элементы из своего списка. Вместо этого вам нужно позвонить .remove() на родительский элемент. ElementTree не сохраняет родительские указатели; если только элемент CONFIG вы не можете вернуть элемент VIEW, который является его родительским.

Это означает, что вам также необходимо сохранить ссылку на родителя. Loop над элементами VIEW, затем в вложенном цикле найдите элементы CONFIG, которые вы хотите удалить, и с еще доступным родителем VIEW вызовите .remove(), чтобы удалить дочерний элемент из этого родителя.

+0

Я отредактировал в своем грязном решении, но я подумаю о том, как сделать его лучше с вашим ответом, спасибо. – Paul