Quiero reemplazar elementos secundarios de un árbol a otro, según algunos criterios. Puedo hacer esto usando Comprensión? Pero, ¿cómo reemplazamos el elemento en ElementTree?¿Cómo puedo reemplazar un elemento hijo (s) en ElementTree
5
A
Respuesta
2
No puede reemplazar un elemento del ElementTree
, solo puede trabajar con Element
.
Incluso cuando llame al ElementTree.find()
es solo un atajo para getroot().find()
.
Por lo que realmente necesitan:
- extraer el elemento padre
- uso comprensión (o lo que quieras) en ese elemento padre
La extracción del elemento padre puede ser fácil si su objetivo es un subelemento raíz (solo llame al getroot()
), de lo contrario, tendrá que encontrarlo.
2
1
Soy nuevo en Python, pero he encontrado una manera poco fiable para hacer esto:
Archivo de entrada input1.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<import ref="input2.xml" />
<name awesome="true">Chuck</name>
</root>
Archivo de entrada input2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar>blah blah</bar>
</foo>
Python código: (nota, desordenado y hacky)
import os
import xml.etree.ElementTree as ElementTree
def getElementTree(xmlFile):
print "-- Processing file: '%s' in: '%s'" %(xmlFile, os.getcwd())
xmlFH = open(xmlFile, 'r')
xmlStr = xmlFH.read()
et = ElementTree.fromstring(xmlStr)
parent_map = dict((c, p) for p in et.getiterator() for c in p)
# ref: https://stackoverflow.com/questions/2170610/access-elementtree-node-parent-node/2170994
importList = et.findall('.//import[@ref]')
for importPlaceholder in importList:
old_dir = os.getcwd()
new_dir = os.path.dirname(importPlaceholder.attrib['ref'])
shallPushd = os.path.exists(new_dir)
if shallPushd:
print " pushd: %s" %(new_dir)
os.chdir(new_dir) # pushd (for relative linking)
# Recursing to import element from file reference
importedElement = getElementTree(os.path.basename(importPlaceholder.attrib['ref']))
# element replacement
parent = parent_map[importPlaceholder]
index = parent._children.index(importPlaceholder)
parent._children[index] = importedElement
if shallPushd:
print " popd: %s" %(old_dir)
os.chdir(old_dir) # popd
return et
xmlET = getElementTree("input1.xml")
print ElementTree.tostring(xmlET)
da la salida:
-- Processing file: 'input1.xml' in: 'C:\temp\testing'
-- Processing file: 'input2.xml' in: 'C:\temp\testing'
<root>
<foo>
<bar>blah blah</bar>
</foo><name awesome="true">Chuck</name>
</root>
esto se concluyó con información de:
Cuestiones relacionadas
- 1. ¿Cómo puedo obtener la posición de un elemento hijo en relación con un elemento primario?
- 2. Atravesando un elemento hijo específico con Prototype
- 3. Cómo obtener elemento hijo en ExtJS 4
- 4. jquery eliminar elemento hijo directo
- 5. ¿Cómo seleccionar un elemento hijo único usando jQuery?
- 6. No se puede volcar o escribir un elemento ElementTree
- 7. jQuery hijo del elemento cliquete
- 8. Python y ElementTree: return "inner XML" excluyendo elemento padre
- 9. Obtener atributo del elemento hijo
- 10. Encuentra elemento de texto con XPath en elementtree
- 11. Observable Colección reemplazar elemento
- 12. obtener el n-ésimo hijo de un elemento en jquery
- 13. ¿Cómo obtengo la posición de un elemento hijo
- 14. ¿Cómo puedo usar un selector no: primer hijo?
- 15. ¿Cómo obtener elemento hijo por ID en JavaScript?
- 16. ¿Cómo puedo actualizar un elemento en un vector en Clojure?
- 17. ¿Cómo puedo seleccionar un enésimo hijo sin conocer el elemento padre?
- 18. Inserte un nodo de un elemento en XML con Python/elementtree
- 19. Si el elemento padre no contiene cierto elemento hijo; jQuery
- 20. elementtree XPath - Seleccionar elemento basado en el atributo
- 21. ¿Cómo puedo reemplazar paréntesis en vim
- 22. Prevenir javascript onclick el elemento hijo
- 23. Práctica recomendada: ¿Agregar nodo hijo a un elemento primario en el constructor hijo o no?
- 24. elemento Anexar como hijo del elemento anti-XML
- 25. ¿Cómo puedo convertir un elemento DOM en un elemento jQuery?
- 26. elementtree índice de elemento de mirar hacia arriba
- 27. Mostrar el elemento hijo encima del elemento principal usando CSS
- 28. ¿Cómo puedo usar 's ///' si mi cadena contiene un '/'?
- 29. ¿Cómo hacer un elemento hijo limitado en tamaño por su padre en WPF?
- 30. lxml convert element a elementtree
Esto podría ayudar: http://stackoverflow.com/q/4788633/535275 –