9

我正在使用 xmltodict 来解析 XML 配置。XML 具有一个元素可以出现在 1 到 n 个实例中的结构,其中两个实例都有效:

<items>
    <item-ref>abc</item-ref>
</items>

<items>
    <item-ref>abc</item-ref>
    <item-ref>dca</item-ref>
    <item-ref>abb</item-ref>
</items>

我正在用 xmltodict 解析它,如下所示:

document['items']['item-ref']

它返回一个 unicode 或一个列表(取决于找到的项目),所以我总是需要添加一个额外的检查来确保我是否需要处理一个列表或一个字符串:

if isinstance(document['items']['item-ref'], list):
    my_var = document['items']['item-ref']
else:
    my_var = [document['items']['item-ref']] #create list manually

有没有更好/更简单/更优雅的方式来处理这些?

4

1 回答 1

4

我不确定是否有一种超级优雅的方式来做到这一点。Python 没有任何内置方法或函数可以帮助您在一行代码中完成此操作。然而,为了整合代码,您将需要做一些事情。正如 matsjoyce 在评论中提到的,您可能只是想创建一个函数来为您处理此逻辑。

def listn(val=None):
    if val is None:
        return []
    return val if isinstance(val, list) else [val]

>>> listn([1, 2, 3])
[1, 2, 3]
>>> listn()
[]
>>> listn(3)
[3]

现在您可以简单地使用您的 val 调用该函数并期望 alist返回,无论它是 a list、 anint还是NoneType对象:

my_var = listn(document['items']['item-ref'])

(我的第一个答案创建了一个 的子类list,但这需要 6 行而不是 4 行,并且更改了type--not 最理想的副作用。)

于 2014-12-15T17:07:48.250 回答