是否可以从具有另一个列表和字典的列表中自动创建XML文件?

问题描述 投票:0回答:1

例如,我有一些列表,还有另一个列表和字典。

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

json.dumps()可以自动解析它并创建.json文件。 XML和JSON具有不同的语法,但是也许有一种方法可以解析此列表并自动构建XML树?还是我必须手动构建它?

python xml
1个回答
1
投票

当然,但是由于没有将方法映射到属性与子元素的唯一方法,因此您必须弄清楚自己...或者只是将所有元素都做成并希望达到最佳效果,如下所示。

我为使用_tag设置字典的XML标签添加了功能。

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>
© www.soinside.com 2019 - 2024. All rights reserved.