Можно ли автоматически создать XML файл из списка с другими списками и диктовками? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть список с другими списками и диктовками, например.

data = [
        {"id": 0,
        "name": "Room #0",
        "students": [
            {
                "id": 345,
                "name": "William Perez"
            },
            {
                "id": 976,
                "name": "Daniel Smith"
            },
            ...
        },
        ...
    ]

json.dumps() может автоматически его проанализировать и создать. json файл. XML и JSON имеют разную грамматику, но может быть есть способ проанализировать этот список и автоматически построить дерево XML? Или я должен построить его вручную?

1 Ответ

2 голосов
/ 07 февраля 2020

Конечно, но поскольку не существует единого способа сопоставить вещи атрибутам и подэлементам, вам придется выяснить это самостоятельно ... или просто создать все элементы и надеяться на лучшее, как показано ниже.

Я добавил возможность установки тега 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...