xmltodict不返回一个元素的列表

use*_*880 8 python list xmltodict

如果"车库"中只有一个"汽车",则以下代码会产生错误:

import xmltodict

mydict = xmltodict.parse(xmlstringResults)    
for carsInGarage in mydict['garage']['car']:
    # do something...
Run Code Online (Sandbox Code Playgroud)

原因是mydict['garage']['car']只有一个列表,如果有一个以上的"汽车"元素.所以我做了这样的事情:

import xmltodict

mydict = xmltodict.parse(xmlstringResults)
if isinstance(mydict['garage']['car'], list):
    for carsInGarage in mydict['garage']['car']:
        # do something for each car...
else:
    # do something for the car
Run Code Online (Sandbox Code Playgroud)

让代码运行.但对于更高级的操作,这不是解决方案.

有人知道某种功能,即使只有一个元素吗?

Jac*_*dre 14

在Github上的这个问题中讨论了这个问题.xmltodict包现在支持

d = xmltodict.parse(s, force_list={'car'})
Run Code Online (Sandbox Code Playgroud)

虽然如果该字段不存在,这仍然不会创建一个空列表.


use*_*880 4

这当然不是一种优雅的方式,但这就是我为让代码运行所做的事情(如果有人遇到同样的问题并通过谷歌发现这一点):

import xmltodict

def guaranteed_list(x):
    if not x:
        return []
    elif isinstance(x, list):
        return x
    else:
        return [x]

mydict = xmltodict.parse(xmlstringResults)    
for carsInGarage in guaranteed_list(mydict['garage']['car']):
    # do something...
Run Code Online (Sandbox Code Playgroud)

但我想我会再次编写我的代码并“直接使用 XML”,正如评论之一所说。