处理1到n个元素

时间:2014-12-15 15:10:18

标签: python xml xmltodict

我使用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

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

1 个答案:

答案 0 :(得分: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调用该函数,并期望返回list,无论是listint还是NoneType对象:

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

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