All'interno di lxml, è possibile, dato un elemento, spostare l'intera cosa altrove nel documento xml senza dover leggere tutti i suoi figli e ricrearlo? Il mio miglior esempio sarebbe cambiare i genitori. Ho frugato un po 'sui documenti ma non ho avuto molta fortuna. Grazie in anticipo!Sposta un intero elemento con lxml.etree
7
A
risposta
14
.append
, .insert
e altre operazioni fanno che per default
>>> from lxml import etree
>>> tree = etree.XML('<a><b><c/></b><d><e><f/></e></d></a>')
>>> node_b = tree.xpath('/a/b')[0]
>>> node_d = tree.xpath('/a/d')[0]
>>> node_d.append(node_b)
>>> etree.tostring(tree) # complete 'b'-branch is now under 'd', after 'e'
'<a><d><e><f/></e><b><c/></b></d></a>'
>>> node_f = tree.xpath('/a/d/e/f')[0] # Nothing stops us from moving it again
>>> node_f.append(node_a) # Now 'a' is deep under 'f'
>>> etree.tostring(tree)
'<a><d><e><f><b><c/></b></f></e></d></a>'
Fare attenzione quando si spostano i nodi avere un testo di coda. Nel testo della coda lxml appartengono al nodo e si spostano con esso. (Inoltre, quando si elimina un nodo, il suo testo coda viene eliminato anche)
>>> tree = etree.XML('<a><b><c/></b>TAIL<d><e><f/></e></d></a>')
>>> node_b = tree.xpath('/a/b')[0]
>>> node_d = tree.xpath('/a/d')[0]
>>> node_d.append(node_b)
>>> etree.tostring(tree)
'<a><d><e><f/></e><b><c/></b>TAIL</d></a>'
A volte è un effetto desiderato, ma a volte avrete bisogno di qualcosa di simile:
>>> tree = etree.XML('<a><b><c/></b>TAIL<d><e><f/></e></d></a>')
>>> node_b = tree.xpath('/a/b')[0]
>>> node_d = tree.xpath('/a/d')[0]
>>> node_a = tree.xpath('/a')[0]
>>> # Manually move text
>>> node_a.text = node_b.tail
>>> node_b.tail = None
>>> node_d.append(node_b)
>>> etree.tostring(tree)
>>> # Now TAIL text stays within its old place
'<a>TAIL<d><e><f/></e><b><c/></b></d></a>'
0
Si potrebbe utilizzare .append()
, .insert()
metodi per aggiungere un elemento secondario all'elemento esistente:
>>> from lxml import etree
>>> from_ = etree.fromstring("<from/>")
>>> to = etree.fromstring("<to/>")
>>> to.append(from_)
>>> etree.tostring(to)
'<to><from/></to>'
Problemi correlati
- 1. Sposta un elemento alla fine dell'array
- 2. Sposta la selezione dopo un elemento DOM
- 3. salvataggio di un oggetto 'lxml.etree._ElementTree'
- 4. Perché Python tratta una tupla con un elemento come intero?
- 5. jQuery, ottieni html di un intero elemento
- 6. Elemento successivo in * intero * documento dopo un determinato elemento
- 7. lista Sposta elemento alla fine in STL
- 8. Come si sposta un elemento HTML in jQuery?
- 9. jquery, sposta un elemento interno nella prima posizione?
- 10. Come risolvere soggetti esterni con xml.etree come lxml.etree
- 11. Sposta con vector :: push_back
- 12. Esistono problemi di ambito se si sposta un elemento da un contenitore a un altro?
- 13. Come spostare un intero elemento div su x pixel?
- 14. Java xpath per restituire un intero elemento come stringa
- 15. Inserisci elemento in linea e animazione sposta a sinistra
- 16. Perforce: sposta un elenco di modifiche memorizzato da un elemento principale all'altro?
- 17. Stile corpo elemento a schermo intero?
- 18. Bit che sposta un personaggio con un wrap? C++
- 19. Conversione di un elenco di un elemento in un numero intero
- 20. Scrittura di un numero intero con un file con fputs()
- 21. Ridimensiona e sposta un UIView con Core Animation (CAKeyFrameAnimation)
- 22. Come si sposta Pandas DataFrame con un multiindex?
- 23. Div sposta in IE
- 24. come registrare un valore intero con log.d?
- 25. Come sapere quando un elemento DOM si sposta o viene ridimensionato
- 26. con-current-buffer non sposta il punto
- 27. Schermo intero con pyqt4?
- 28. ottenere gli errori quando importazione lxml.etree a Python
- 29. Android sposta continuamente lo sfondo con animazione
- 30. Utilizzo di python lxml.etree per enormi file XML
Esattamente quello che mi serviva. Grazie! – Cryptite
Type-o ?: node_a dovrebbe essere node_b sulla riga "node_f.append (node_a) # Ora 'a' è in profondità in 'f'" (anche correggere commento 'a') –