Tengo la siguiente función que hace un crudo trabajo de análisis de un archivo XML en un diccionario.¿Cómo se puede reescribir esta función para implementar OrderedDict?
Desafortunadamente, dado que los diccionarios de Python no están ordenados, no puedo pasar por los nodos como me gustaría.
Cómo modifico esto para que emita un diccionario ordenado que refleje el orden original de los nodos cuando se realiza un bucle con 'for'.
def simplexml_load_file(file):
import collections
from lxml import etree
tree = etree.parse(file)
root = tree.getroot()
def xml_to_item(el):
item = None
if el.text:
item = el.text
child_dicts = collections.defaultdict(list)
for child in el.getchildren():
child_dicts[child.tag].append(xml_to_item(child))
return dict(child_dicts) or item
def xml_to_dict(el):
return {el.tag: xml_to_item(el)}
return xml_to_dict(root)
x = simplexml_load_file('routines/test.xml')
print x
for y in x['root']:
print y
Salidas:
{'root': {
'a': ['1'],
'aa': [{'b': [{'c': ['2']}, '2']}],
'aaaa': [{'bb': ['4']}],
'aaa': ['3'],
'aaaaa': ['5']
}}
a
aa
aaaa
aaa
aaaaa
¿Cómo puedo implementar collections.OrderedDict para que pueda estar seguro de conseguir el orden correcto de los nodos?
archivo XML para referencia:
<root>
<a>1</a>
<aa>
<b>
<c>2</c>
</b>
<b>2</b>
</aa>
<aaa>3</aaa>
<aaaa>
<bb>4</bb>
</aaaa>
<aaaaa>5</aaaaa>
</root>
duplicado de http: // stackoverflow. com/questions/4123266/python-looping-seem-to-not-follow-sequence del mismo autor. –