首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmltodict不返回一个元素的列表。

xmltodict不返回一个元素的列表。
EN

Stack Overflow用户
提问于 2016-05-13 10:15:42
回答 4查看 8.1K关注 0票数 26

如果“车库”中只有一个“汽车”,以下代码将产生一个错误:

代码语言:javascript
复制
import xmltodict

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

原因是,只有当“汽车”中有多个元素时,mydict['garage']['car']才是一个列表。所以我做了这样的事:

代码语言:javascript
复制
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

让代码运行。但对于更先进的行动来说,这不是解决办法。

有人知道某种函数可以使用吗,即使只有一个元素?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-19 09:42:02

当然,这不是一种优雅的方法,但这是我为运行代码所做的(如果有人在google上发现了同样的问题):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-21 20:07:18

关于吉突布的这个问题中讨论了这个问题。xmltodict包现在支持

代码语言:javascript
复制
d = xmltodict.parse(s, force_list={'car'})

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

票数 36
EN

Stack Overflow用户

发布于 2020-11-06 03:38:58

我使用的组合

1)

代码语言:javascript
复制
json_dict = xmltodict.parse(s, force_list={'item'})

2)

代码语言:javascript
复制
# Removes a level in python dict if it has only one specific key
# 
# Examples: 
# recursive_skip_dict_key_level({"c": {"a": "b"}}, "c")  # -> {"a", "b"}
# recursive_skip_dict_key_level({"c": ["a", "b"]}, "c") # -> ["a", "b"]
#
def recursive_skip_dict_key_level(d, skipped_key):
    if issubclass(type(d), dict):
        if list(d.keys()) == [skipped_key]:
            return recursive_skip_dict_key_level(d[skipped_key], skipped_key)
        else:
            for key in d.keys():
                d[key] = recursive_skip_dict_key_level(d[key], skipped_key)
            return d
    elif issubclass(type(d), list):
        new_list = []
        for e in d: 
            new_list.append(recursive_skip_dict_key_level(e, skipped_key))
        return new_list
    else: 
        return d
代码语言:javascript
复制
# Removes None values from a dict
# 
# Examples: 
# recursive_remove_none({"a": None})  # -> {}
# recursive_remove_none([None]) # -> []
#
def recursive_remove_none(d):
    if issubclass(type(d), dict):
        new_dict = {}
        for key in d.keys():
            if not (d[key] is None):
                new_dict[key] = recursive_remove_none(d[key])
        return new_dict
    elif issubclass(type(d), list):
        new_list = []
        for e in d: 
            if not (e is None):
                new_list.append(recursive_remove_none(e))
        return new_list
    else: 
        return d       
代码语言:javascript
复制
json_dict = recursive_skip_dict_key_level(json_dict, "item")
json_dict = recursive_remove_none(json_dict)

将任何"item“XML-元素解释为列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37207353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档