Конечно, но поскольку не существует единого способа сопоставить вещи атрибутам и подэлементам, вам придется выяснить это самостоятельно ... или просто создать все элементы и надеяться на лучшее, как показано ниже.
Я добавил возможность установки тега XML для dict с _tag
.
import xml.etree.ElementTree as et
def emit_xml(tree, obj, tag="object"):
if isinstance(obj, list):
for ent in obj:
emit_xml(tree, ent, tag)
elif isinstance(obj, dict):
obj = obj.copy()
tag = obj.pop("_tag", tag)
tree = et.SubElement(tree, tag)
for key, value in obj.items():
emit_xml(tree, value, tag=key)
else:
et.SubElement(tree, tag).text = str(obj)
data = [
{
"_tag": "room",
"id": 0,
"name": "Room #0",
"students": [
{"id": 345, "name": "William Perez"},
{"id": 976, "name": "Daniel Smith"},
],
},
{
"_tag": "room",
"id": 1,
"name": "Room #1",
"students": [
{"id": 357357, "name": "Wirelliam Pez"},
{"id": 7222, "name": "Del Smitanih"},
],
},
]
root = et.Element("root")
emit_xml(root, data)
print(et.tostring(root, encoding="unicode"))
выходами
<root>
<room>
<id>0</id>
<name>Room #0</name>
<students>
<id>345</id>
<name>William Perez</name>
</students>
<students>
<id>976</id>
<name>Daniel Smith</name>
</students>
</room>
<room>
<id>1</id>
<name>Room #1</name>
<students>
<id>357357</id>
<name>Wirelliam Pez</name>
</students>
<students>
<id>7222</id>
<name>Del Smitanih</name>
</students>
</room>
</root>