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) 

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

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.