Obtén una nota secundaria única utilizando lxml.
Editar – El problema era que estaba ejecutando una versión desactualizada de lxml – me siento realmente tonto ahora, pero estoy contento de haberlo descubierto.
Tengo problemas para iterar a través de un árbol XML para exportar elementos secundarios individuales.
Lo que estoy buscando es aislar los elementos secundarios y exportarlos en archivos XML separados. Pero mi problema es que cuando estoy usando la función ‘etree.iter’, no solo estoy obteniendo los elementos hijos, también estoy obteniendo todos los hermanos siguientes. ¿Cómo puedo obtener solo un elemento hijo a la vez?
Esto debería explicarlo mejor. Aquí está mi código de ejemplo:
from lxml import etree
root = etree.XML("<users><user><name>Test</name><id>01</id></user> \
<user><name>Test</name><id>02</id></user> \
<user><name>Test</name><id>03</id></user></users>")
for record in root.iter("user"):
print(etree.tostring(record))
Produce la siguiente salida:
b'<user><name>Test</name><id>01</id></user><user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>03</id></user></users>'
Pero lo que necesito es:
b'<user><name>Test</name><id>01</id></user>'
b'<user><name>Test</name><id>02</id></user>'
b'<user><name>Test</name><id>03</id></user>'
¿Qué estoy haciendo mal?
davy.ai
Parece que el problema está en el uso de la función
iter
. La funcióniter
itera a través de todos los elementos coincidentes en todo el árbol XML, no solo en los hijos inmediatos.Para obtener solo los elementos hijos inmediatos, podemos usar la función
findall
en el elemento raíz y especificar el elemento hijo deseado. Aquí está el código actualizado:Esto debería dar como resultado lo que estás buscando: