Dentro de lxml, ¿es posible, dado un elemento, mover todo en otro lugar en el documento xml sin tener que leer todos sus elementos secundarios y volver a crearlo? Mi mejor ejemplo sería cambiar a los padres. He rebuscado un poco en los documentos pero no he tenido mucha suerte. ¡Gracias por adelantado!Mover un elemento completo con lxml.etree
7
A
Respuesta
14
.append
, .insert
y otras operaciones de hacer que por defecto
>>> 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>'
Tenga cuidado al mover los nodos que tienen un texto de cola. En lxml, el texto de cola pertenece al nodo y se mueve con él. (También, cuando se elimina un nodo, también se elimina el texto de la cola)
>>> 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 veces es un efecto deseado, pero a veces se necesita algo así:
>>> 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
Usted podría utilizar .append()
, .insert()
métodos para agregar un subelemento al elemento existente:
>>> from lxml import etree
>>> from_ = etree.fromstring("<from/>")
>>> to = etree.fromstring("<to/>")
>>> to.append(from_)
>>> etree.tostring(to)
'<to><from/></to>'
Cuestiones relacionadas
- 1. lxml.etree, element.text no devuelve el texto completo de un elemento
- 2. Cómo mover un elemento div completo hasta x píxeles?
- 3. Mover un elemento DOM con append()?
- 4. guardando un objeto 'lxml.etree._ElementTree'
- 5. ¿Mover un elemento dentro de una lista?
- 6. ¿Cómo mover un elemento en NSMutableArray?
- 7. jQuery - mover a un lugar determinado elemento
- 8. Mover un elemento hacia arriba o hacia abajo a seleccionar
- 9. jQuery, obtener html de un elemento completo
- 10. Cómo mover el elemento HTML
- 11. mover directorios con Historia
- 12. Mover un elemento DIV a la parte inferior del elemento principal (como último elemento secundario)
- 13. Cómo mover un elemento en Movimiento diagonal en jQuery?
- 14. arrastrar y soltar sin mover el elemento
- 15. lista Mover elemento al final de STL
- 16. cómo mover un elemento de vista de lista hacia arriba o hacia abajo con un clic
- 17. ¿Cómo iba a mover un patrón de SVG con un elemento
- 18. ¿Cómo mover un elemento en una lista en Haskell?
- 19. Reemplazar elemento completo en lugar de innerHTML?
- 20. Mover UIView con desaceleración
- 21. Copie un directorio completo con phing
- 22. Cómo mover el elemento con el elemento de script sin volver a ejecutar el script con jQuery?
- 23. Mover un directorio atómicamente
- 24. C#/.NET: Mover al elemento deseado en BindingNavigator
- 25. Mover un objeto python/django de un modelo principal a un elemento secundario (subclase)
- 26. Usando python lxml.etree para archivos XML de gran tamaño
- 27. Python 2.7 en Google App Engine, no puedo usar lxml.etree
- 28. Mover un elemento de matriz a un nuevo índice en PHP
- 29. Mover un uiimageview animado
- 30. ¿Puedo mover un UIAlertView?
Exactamente lo que necesitaba. ¡Gracias! – Cryptite
Tipo-o ?: node_a debe ser node_b en la línea "node_f.append (node_a) # Ahora 'a' está muy por debajo de 'f'" (también corrige el comentario 'a') –