Come clonare Element
oggetti in Python ? Sto provando a spostare e copiare proceduralmente (quindi modificare i loro attributi) nodi.etree Clone Node
risposta
È possibile utilizzare solo copy.deepcopy() per creare una copia dell'elemento. (questo funzionerà anche con lxml).
Se si dispone di una maniglia su s' parent
il Element
elem
è possibile chiamare
new_element = SubElement(parent, elem.tag, elem.attrib)
In caso contrario si potrebbe desiderare di provare
new_element = makeelement(elem.tag, elem.attrib)
ma questo non è consigliato.
penso che non copiano i nodi figlio .. –
@SHiNKiROU Puoi confrontare 'id (old_element)' con 'id (new_element)' per vedere se crea effettivamente un oggetto diverso in memoria. questo aiuta? –
Come menziona @ Ming-Tang, questo ** non ** copia i bambini. – halloleo
Una diversa soluzione, e piuttosto disturbante:
new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
Almeno in Python 2.7 eTree elemento ha un metodo di copia: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233
È una copia, ma che è preferibile in alcuni casi .
Nel mio caso sto duplicando alcuni elementi SVG e aggiungendo una trasformazione. Duplicare i bambini non servirebbe a nessuno scopo poiché, se pertinente, già ereditano la trasformazione dei loro genitori.
Per chi usa questo e pensa di sostituire * xml.etree.ElementTree * con * lxml.etree * in futuro, si noti che 'Element.copy()' non esiste in * lxml.etree *, e 'copy.copy()' copia anche i bambini, se applicati a 'lxml.etree.Element'. – meowsqueak
Non funziona con cElementTree (Python 2.7). Quindi preferisci copy.copy() (copia superficiale) o copy.deepcopy() per l'evolutività del codice. – Thierry
Per riferimento futuro.
più semplice modo per copiare un nodo (o albero) e tenerlo per bambini, senza dover importare ALTRO biblioteca SOLO per questo:
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
Per essere chiari, questa non è una copia profonda. (Sì, il post dice "e mantieni i suoi figli", ma sentivo ancora il bisogno di testare cosa significasse). – harpo
- 1. clone node on drag
- 2. Duplicate/Clone Node in JavaFX 2.0
- 3. Come salvare un oggetto xml etree? il risparmio di carico lxml problema oggetti eTree
- 4. Errore nell'utilizzo di etree in lxml
- 5. Python controllo eTree formato tag vuoto
- 6. clone fila
- 7. farmville clone
- 8. Analisi XML: Albero degli elementi (etree) vs minidom
- 9. iterare su testo e gli elementi in eTree lxml
- 10. clone() ha accesso protetto - reso pubblico Oggetto clone()
- 11. Clone-equivalent of fork?
- 12. Errore clone git Hudson
- 13. Ripresa clone git-svn
- 14. Git Clone Failure
- 15. Repository clone JGit
- 16. java: clone metodo violazione
- 17. Clone repository in GitHub
- 18. Errore clone Github
- 19. metodo clone() in Java
- 20. jQuery tabella riga clone
- 21. Java - abbattuti nel clone
- 22. Rubino DUP/clone ricorsivamente
- 23. Clone Winform control
- 24. come aggiornare git clone
- 25. Git clone --bare/fetch
- 26. PHP clone parola chiave
- 27. Clone profondo dell'entità Hibernate
- 28. Come funziona git clone
- 29. Oggetto clone in JavaScript
- 30. Che cosa esattamente typedef struct node {...} Node; rappresentare?
Questo fa una copia, ma non viene aggiunta all'albero. Dovrai fare un 'append()' o 'insert()' per farlo. –
tra l'altro anche per cElementTree ;-) – Thierry