使用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
相关产品推荐
相关产品推荐

