2016-05-13 66 views
2

下面的代码产生一个错误,如果只有一个“车”,在“车库”:xmltodict不返回一个列表,一个元素

import xmltodict 

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

的原因是,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 

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

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

+0

不要使用像'dict'这样的保留关键字作为变量名! – Jens

+0

如果['xmltodict'](https://github.com/martinblech/xmltodict)返回一辆汽车或一辆汽车列表,您的解决方案是合适的(请参阅[duck typing](https://en.wikipedia) .org/wiki/Duck_typing)在Python中)。但是请记住,XML是有序的,生成的JSON使用了一个无序的'dict'!是否有任何理由不直接使用XML,例如与[lxml](http://lxml.de/)? – Jens

+0

在我的真实代码中,它有不同的名称,但我也修复了代码上面的代码,谢谢。 - 我第一次尝试使用ElementTree,但是我遇到了一些编码问题...我也许这种方式更好...也许我错了 – user2111880

回答

1

这当然不是一种优雅的方式,但是这是我做了什么让代码运行(如果有人长谷同probleme通过谷歌的发现这一点):

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... 

,但我的事情,我将会再次编写我的代码,并且“直接使用XML”作为评论之一。

4

此问题在this issue on Github中讨论。 xmltodict包现在支持

d = xmltodict.parse(s, force_list={'car'}) 

尽管如果该字段不存在,这仍然不会创建空列表。