2016-05-13 68 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'}) 

儘管如果該字段不存在,這仍然不會創建空列表。