Моя модификация ответа Даниила, чтобы дать немного более точный словарь:
def xml_to_dictionary(element):
l = len(namespace)
dictionary={}
tag = element.tag[l:]
if element.text:
if (element.text == ' '):
dictionary[tag] = {}
else:
dictionary[tag] = element.text
children = element.getchildren()
if children:
subdictionary = {}
for child in children:
for k,v in xml_to_dictionary(child).items():
if k in subdictionary:
if ( isinstance(subdictionary[k], list)):
subdictionary[k].append(v)
else:
subdictionary[k] = [subdictionary[k], v]
else:
subdictionary[k] = v
if (dictionary[tag] == {}):
dictionary[tag] = subdictionary
else:
dictionary[tag] = [dictionary[tag], subdictionary]
if element.attrib:
attribs = {}
for k,v in element.attrib.items():
attribs[k] = v
if (dictionary[tag] == {}):
dictionary[tag] = attribs
else:
dictionary[tag] = [dictionary[tag], attribs]
return dictionary
namespace - это строка xmlns, включая фигурные скобки, которую ElementTree добавляет ко всем тегам, поэтому здесь я очистил ее, так как для всего документа существует одно пространство имен
Обратите внимание, что я также настроил необработанный xml, чтобы «пустые» теги создавали самое большее текстовое свойство в представлении ElementTree
spacepattern = re.compile(r'\s+')
mydictionary = xml_to_dictionary(ElementTree.XML(spacepattern.sub(' ', content)))
даст, например,
{'note': {'to': 'Tove',
'from': 'Jani',
'heading': 'Reminder',
'body': "Don't forget me this weekend!"}}
он разработан для конкретного xml, который в основном эквивалентен json, должен обрабатывать атрибуты элемента, такие как
<elementName attributeName='attributeContent'>elementContent</elementName>
слишком
есть возможность объединить словарь атрибутов / словарь вложенных тегов аналогично тому, как объединяются повторяющиеся вложенные теги, хотя вложение списков кажется уместным: -)