Мне приходится обрабатывать XML-документы, которые достаточно большие (до 1 ГБ) и анализировать их с помощью python. Я использую iterparse() (разбор стиля SAX).
Меня беспокоит следующее: представьте, что у вас есть xml, как этот
<?xml version="1.0" encoding="UTF-8" ?>
<families>
<family>
<name>Simpson</name>
<members>
<name>Hommer</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>
Проблема заключается, конечно, в том, чтобы знать, когда я получаю фамилию (как Симпсоны), и когда я получаю имя одного из членов этого семейства (например, Hommer)
То, что я делал до сих пор, это использовать "переключатели", которые скажут мне, есть ли я внутри тега "members" или нет, код будет выглядеть следующим образом:
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()
И это отлично работает, поскольку вывод
The family is Simpson
The member of the family is Hommer
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
Меня беспокоит то, что с помощью этого (простого) примера мне пришлось создать дополнительную переменную, чтобы знать, в каком теге я (on_members_tag) представить с помощью истинных примеров xml, которые мне нужно обрабатывать, у них больше вложенных тегов.
Также обратите внимание, что это очень сокращенный пример, поэтому вы можете предположить, что я могу столкнуться с xml с большим количеством тегов, более внутренних тегов и попыткой получить разные имена тегов, атрибуты и т.д.
Итак, вопрос есть. Я делаю здесь что-то ужасно глупо? Я чувствую, что должно быть более элегантное решение.