Если хочешь ещё глубже копнуть, глянь в сторону библиотеки lxml. Она мощнее, но и код чуть сложнее будет такой:
Программный код:
from lxml import etree
import json
parser = etree.XMLParser()
with open('data.xml', 'rb') as xml_file:
tree = etree.parse(xml_file, parser)
root = tree.getroot()
def etree_to_dict(t):
d = {t.tag: {} if t.attrib else None}
children = list(t)
if children:
dd = dict((child.tag, etree_to_dict(child)) for child in children)
d = {t.tag: dd}
elif t.attrib:
d[t.tag].update('@' + k for k, v in t.attrib.items())
else:
d[t.tag] = t.text
return d
data_dict = etree_to_dict(root)
json_data = json.dumps(data_dict, indent=4)
with open('data.json', 'w') as json_file:
json_file.write(json_data)