Tengo que manejar documentos xml que sean lo suficientemente grandes (hasta 1GB) y analizarlos con python. Estoy utilizando la función iterparse() (análisis de estilo SAX).ElementTree iterparse strategy
Mi preocupación es la siguiente, imagine que tiene un xml como esto
<?xml version="1.0" encoding="UTF-8" ?>
<families>
<family>
<name>Simpson</name>
<members>
<name>Homer</name>
<name>Marge</name>
<name>Bart</name>
</members>
</family>
<family>
<name>Griffin</name>
<members>
<name>Peter</name>
<name>Brian</name>
<name>Meg</name>
</members>
</family>
</families>
El problema es, por supuesto, para saber cuando estoy recibiendo un nombre familiar (Simpson) y cuando estoy recibiendo el nombre de uno de ese miembro de la familia (por ejemplo, Homero)
Lo que he estado haciendo hasta ahora es usar "interruptores" que me digan si estoy dentro de una etiqueta de "miembros" o no, el código se verá así
import xml.etree.cElementTree as ET
__author__ = 'moriano'
file_path = "test.xml"
context = ET.iterparse(file_path, events=("start", "end"))
# turn it into an iterator
context = iter(context)
on_members_tag = False
for event, elem in context:
tag = elem.tag
value = elem.text
if value :
value = value.encode('utf-8').strip()
if event == 'start' :
if tag == "members" :
on_members_tag = True
elif tag == 'name' :
if on_members_tag :
print "The member of the family is %s" % value
else :
print "The family is %s " % value
if event == 'end' and tag =='members' :
on_members_tag = False
elem.clear()
Y esto funciona bien como la salida es
The family is Simpson
The member of the family is Homer
The member of the family is Marge
The member of the family is Bart
The family is Griffin
The member of the family is Peter
The member of the family is Brian
The member of the family is Meg
Mi preocupación es que con este ejemplo (simple) que tenía que crear una variable adicional para saber en qué etiqueta que estaba (on_members_tag) imaginar con los verdaderos ejemplos xml que tengo que manejar, tienen más etiquetas anidadas.
También tenga en cuenta que este es un ejemplo muy reducido, por lo que puede suponer que puedo enfrentar un xml con más etiquetas, más etiquetas internas y tratando de obtener diferentes nombres de etiquetas, atributos, etc.
Así que la pregunta es. ¿Estoy haciendo algo terriblemente estúpido aquí? Siento que debe haber una solución más elegante para esto.
¿Qué vas a hacer con los datos? ¿Construir una estructura de datos Python para mantener todo, o almacenar en db mientras se itera, o algo más? –
@JanneKarila: Los datos se pueden poner en estructura python, guardar en db o volcar en un archivo, dependerá del proceso, en este caso se puede suponer que se escribirá en db –