es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el uso de la función iter. La función iter 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:

    from lxml import etree
    
    raiz = etree.XML("<usuarios><usuario><nombre>Prueba</nombre><id>01</id></usuario> \
                             <usuario><nombre>Prueba</nombre><id>02</id></usuario> \
                             <usuario><nombre>Prueba</nombre><id>03</id></usuario></usuarios>")
    
    for registro in raiz.findall(".//usuario"):
        print(etree.tostring(registro))
    

    Esto debería dar como resultado lo que estás buscando:

    b'<usuario><nombre>Prueba</nombre><id>01</id></usuario>'
    b'<usuario><nombre>Prueba</nombre><id>02</id></usuario>'
    b'<usuario><nombre>Prueba</nombre><id>03</id></usuario>'
    

Comments are closed.