首页 > 解决方案 > 带有 force_list 参数的 xmltodict 为空 XML 列表返回一个带有 None 元素的列表

问题描述

我正在解析 XMLxmltodictforce_list=('xml_tag')获取 XML 列表中单个元素的列表。它有效!但是,如果xml_tag没有孩子,它会返回一个[None](带有单个None对象的列表)。如何预防?

XML

<Something>
    <Guitar>
        <name>Walden</name>
        <strings>5</strings>
    </Guitar>
    <Pokemons>
    </Pokemons>
</Something>

PYTHON

res = xmltodict.parse(xml, force_list=('Pokemons',))

res = res['Something']['Guitar']['Pokemons']

pprint(res)

>>> [None]

有什么建议么?

[更新]

对不起,我没有澄清我想要什么。我想得到空列表,因为结果不是带有 None 元素的列表

标签: pythonparsingxmltodict

解决方案


您可以将后处理函数传递给 xmltodict,它允许您修改 dict 值。
但是后处理需要返回一个键和一个值:

import xmltodict
import json


def postprocessor(path, key, value):
    if key == 'Pokemons' and not value:
        return key, []
    return key, value

xml = """<Something>
    <Guitar>
        <name>Walden</name>
        <strings>5</strings>
    </Guitar>
    <Pokemons>
    </Pokemons>
</Something>"""


res = xmltodict.parse(xml, postprocessor=postprocessor)
print(json.dumps(res, indent=2, sort_keys=True))

输出:

{
  "Something": {
    "Guitar": {
      "name": "Walden",
      "strings": "5"
    },
    "Pokemons": []
  }
}

推荐阅读