You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用xmltodict的force_list时,如何避免空标签返回[None]?

解决xmltodict解析空<Pokemons>标签返回[None]的问题

我完全理解你的困扰——force_list=('Pokemons',)确实能保证单个元素返回列表,但遇到空标签时的[None]确实不符合预期。这里有几个实用的解决办法:

方法一:解析后手动过滤None值

这是最直接的方式,拿到结果后用列表推导式过滤掉无效的None元素:

import xmltodict
from pprint import pprint

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

res = xmltodict.parse(xml, force_list=('Pokemons',))
# 注意:原示例代码的路径有误,Pokemons与Guitar是同级元素,不是Guitar的子元素
pokemons = res['Something']['Pokemons']
# 过滤None得到空列表
pokemons = [item for item in pokemons if item is not None]
pprint(pokemons)
# 输出:[]

方法二:使用xmltodict的postprocessor参数(解析时自动处理)

如果不想每次都手动过滤,可以利用xmltodict的postprocessor回调函数,在解析过程中自动处理空标签的情况:

import xmltodict
from pprint import pprint

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

def postprocessor(path, key, value):
    # 当处理的key是'Pokemons'且值为[None]时,返回空列表
    if key == 'Pokemons' and value == [None]:
        return key, []
    return key, value

res = xmltodict.parse(xml, force_list=('Pokemons',), postprocessor=postprocessor)
pprint(res['Something']['Pokemons'])
# 输出:[]

这个方法的好处是一次性配置,后续所有解析都会自动处理空的Pokemons标签,适合多次解析类似XML的场景。

方法三:调整XML的空标签写法(如果有权限修改XML)

如果你能控制XML的生成,可以把空的<Pokemons>标签写成自闭合形式<Pokemons/>,xmltodict解析这种形式时,配合force_list会直接返回空列表:

修改后的XML:

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

然后用原代码解析:

res = xmltodict.parse(xml, force_list=('Pokemons',))
pprint(res['Something']['Pokemons'])
# 输出:[]

不过这个方法依赖XML的修改权限,如果XML是外部传入的,可能不太适用。


内容的提问来源于stack exchange,提问作者catscoolzhyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:53