2014-02-04 3 views
1

Я пытаюсь удалить все строки из файла XML, которые имеют один из этих двух форм:Как удалить определенные атрибуты из ElementTree

<attr key="filename"><string>[SOME_FILENAME]</string></attr> 
<attr key="line_number"><integer>[SOME_NUMBER]</integer></attr> 

Прямо сейчас мой код выглядит следующим образом:

for parent in tree.iter(): 
    for child in parent: 
      if 'key' in child.attrib: 
        if child.attrib['key'] == 'phc.filename': 
          del child.attrib['key'] 
        elif child.attrib['key'] == 'phc.line_number': 
          del child.attrib['key'] 

Но выход не то, что я хочу, это изменение этого:

<attr key="filename"><string>[SOME_FILENAME]</string></attr> 
<attr key="line_number"><integer>[SOME_NUMBER]</integer></attr> 

в этом

<attr><string>[SOME_FILENAME]</string></attr> 
<attr><integer>[SOME_NUMBER]</integer></attr> 

Когда я предпочел бы, чтобы обе эти линии вообще исчезли.

Я также попытался заменить "del child.attrib ['key']" строки с parent.remove (child), но это не работает так, как я пробовал это.

ответ

1

Это потому, что вы только удаление атрибутов, а не сами элементы

Try:

dict = {} 
    for parent in tree.iter(): 
     for child in parent: 
       if 'key' in child.attrib: 
         if child.attrib['key'] == 'phc.filename': 
           dict[child] = parent 
         elif child.attrib['key'] == 'phc.line_number': 
           dict[child] = parent 

    for child in dict: 
     parent = dict[child] 
     parent.remove(child)