Как уже говорили другие minidom - это путь сюда. Вы открываете (и анализируете) файл, проходя через узлы, проверяете, является ли он релевантным и должен быть прочитан. Таким образом, вы также знаете, хотите ли вы читать дочерние узлы.
Сложи это, похоже, делай, что хочешь. Некоторые значения читаются по положению атрибута, а не по имени атрибута. И нет обработки ошибок. И print () в конце означает его Python 3.x.
Я оставлю это как упражнение, чтобы улучшить это, просто хотел опубликовать фрагмент, чтобы вы начали.
Счастливого взлома! :)
xml.txt
<doc>
<id name="X">
<type name="A">
<min val="100" id="80"/>
<max val="200" id="90"/>
</type>
<type name="B">
<min val="100" id="20"/>
<max val="20" id="90"/>
</type>
</id>
</doc>
parsexml.py
from xml.dom import minidom
data={}
doc=minidom.parse("xml.txt")
for n in doc.childNodes[0].childNodes:
if n.localName=="id":
id_name = n.attributes.item(0).nodeValue
data[id_name] = {}
for j in n.childNodes:
if j.localName=="type":
type_name = j.attributes.item(0).nodeValue
data[id_name][type_name] = [(),()]
for k in j.childNodes:
if k.localName=="min":
data[id_name][type_name][0] = \
(k.attributes.item(1).nodeValue, \
k.attributes.item(0).nodeValue)
if k.localName=="max":
data[id_name][type_name][1] = \
(k.attributes.item(1).nodeValue, \
k.attributes.item(0).nodeValue)
print (data)
Выход:
{'X': {'A': [('100', '80'), ('200', '90')], 'B': [('100', '20'), ('20', '90')]}}