Cómo clonar Element
objetos en Python xml.etree
? Estoy intentando mover y copiar (luego modificar sus atributos) los nodos procesales.etree Nodo de clon
Respuesta
Puede simplemente usar copy.deepcopy() para hacer una copia del elemento. (Esto también funcionará con lxml por cierto).
Si usted tiene una manija en el Element
elem
's parent
puede llamar
new_element = SubElement(parent, elem.tag, elem.attrib)
lo contrario puede que desee probar
new_element = makeelement(elem.tag, elem.attrib)
pero esto no es recomendable.
Creo que no copian los nodos secundarios .. –
@SHiNKiROU Puede comparar 'id (old_element)' con 'id (new_element)' para ver si realmente crea un objeto diferente en la memoria. ¿Esto ayuda? –
Como menciona @ Ming-Tang, este ** no ** copia a los niños. – halloleo
Una solución diferente, y algo preocupante:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
Al menos en Python 2.7 etree elemento tiene un método de copia: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233
Es una copia superficial, pero que es preferible en algunos casos .
En mi caso, estoy duplicando algunos elementos SVG y agregando una transformación. La duplicación de los niños no serviría para nada, ya que, cuando sea relevante, ya heredan la transformación de sus padres.
Para cualquiera que use esto y piense en reemplazar * xml.etree.ElementTree * con * lxml.etree * en el futuro, tenga en cuenta que 'Element.copy()' no existe en * lxml.etree *, y 'copy.copy()' también copia hijos cuando se aplica a un 'lxml.etree.Element'. – meowsqueak
No funciona con cElementTree (Python 2.7). Por lo tanto, prefiero copy.copy() (copia superficial) o copy.deepcopy() para la evolutividad del código. – Thierry
Para referencia futura.
forma más sencilla de copiar un nodo (o árbol) y mantenerlo infantil, sin tener que importar OTRO biblioteca SOLO para ello:
def copy_tree(tree_root):
return et.ElementTree(tree_root);
duplicated_node_tree = copy_tree (node); # type(duplicated_node_tree) is ElementTree
duplicated_tree_root_element = new_tree.getroot(); # type(duplicated_tree_root_element) is Element
Para ser claros, esta no es una copia profunda. (Sí, la publicación dice "y conserve a sus hijos", pero todavía sentía la necesidad de probar lo que significaba). – harpo
- 1. Cómo guardar un objeto etree xml? ahorro de carga lxml cuestión objetos eTree
- 2. XML Parsing: Element Tree (etree) vs. minidom
- 3. Farmville clon
- 4. Creando un doctype con el etree de lxml
- 5. lxml etree XMLParser quitar espacio de nombres no deseada
- 6. Reanudar clon git-svn
- 7. jQuery clon duplicate IDs
- 8. clon profundo recomendación utilidad
- 9. Instalación Clon Debian/Ubuntu
- 10. Inspeccionar clon auxiliar
- 11. Controles Clon - C# (Winform)
- 12. clon node en arrastre
- 13. PHP palabra clave clon
- 14. fila de la tabla clon
- 15. C++ Virtual Constructor, sin clon()
- 16. ¿Explicar el clon Mercurial lento?
- 17. ¿Puedo optimizar un clon Mercurial?
- 18. jQuery: elementos y eventos clon
- 19. git-svn clon | ramas espurias
- 20. clon bajo con el JGIT
- 21. ¿equivalente de clon de la horquilla?
- 22. acceso nodo ElementTree nodo primario
- 23. utilidad clon de HashMap en Java
- 24. Faltan archivos de un clon git
- 25. jQuery Fila de la tabla clon
- 26. ¿Qué hay de malo con este clon()?
- 27. partes clon de un proyecto github
- 28. jquery - clon enésima fila de una tabla?
- 29. Cómo hacer un clon de Tetris?
- 30. recuperarse de Git-Svn clon sin --stdlayout
Eso hace una copia, pero no se agrega al árbol. Tendrá que hacer un 'append()' o 'insert()' para hacer eso. –
esto también funciona con cElementTree por cierto ;-) – Thierry