Cómo eliminar un nodo dentro de un iterador en Python xml.etree.ElementTree

¿Cómo eliminar el nodo actual, mientras se itera a través de todos los nodos desde la función raíz por getiterator() ?

 import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() for node in root.getiterator(): #if some condition: #remove(node) 

No puede eliminar nodos sin conocer al padre, pero el paquete xml.etree no le brinda ninguna forma de acceder a un padre desde un nodo determinado.

La única forma de evitar esto es hacer coincidir el nodo principal:

 for node in root.iter(): if some_condition_matches_parent: for child in list(node.iter()): if some_condition_matches_child: node.remove(child) 

Si cambia a la biblioteca lxml (que implementa la misma API, pero con mejoras adicionales), puede recuperar el nodo principal desde cualquier nodo dado:

 node.getparent().remove(node) 

Tenga en cuenta que, si bien la implementación de Element.getiterator() Python puro devuelve un objeto de lista, en la implementación en C del módulo ElementTree (una importación separada en Python 2, importada de manera transparente en Python 3 si está disponible) el método getiterator() devuelve un Generador en vivo que requiere hacer una copia.

Además de eso, el método Element.getiterator() ha quedado en desuso en Python 3.2 y se eliminará por completo en Python 3.9. node.iter() su uso con node.iter() en el bucle externo, y list(node.iter()) en el interno.