22

「ガレージ」に「車」が 1 台しかない場合、次のコードはエラーを生成します。

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

コードを実行します。しかし、より高度な操作の場合、これは解決策ではありません。

要素が1つしかない場合でも、誰かが使用する何らかの機能を知っていますか?

4

4 に答える 4

32

この問題は、Githubのこの問題で議論されています。xmltodict パッケージがサポートするようになりました

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

フィールドが存在しない場合でも、空のリストは作成されません。

于 2016-08-21T20:07:18.597 に答える
4

もちろん、これはエレガントな方法ではありませんが、これはコードを実行するために私が行ったことです(誰かが同じ問題を抱えていて、Google経由でこれを見つけた場合):

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

しかし、コメントの1つが言ったように、コードを再度記述して「XMLを直接使用する」ことにします。

于 2016-05-19T09:42:02.487 に答える
1

既存の回答に加えて、xmltodict は、すべてを強制的にリストにするために、次の機能もサポートするようになりました。

xml = xmltodict.parse(s, force_list=True)
于 2021-07-08T12:54:24.897 に答える