xmltodict 没有 return 一个元素的列表
xmltodict does not return a list for one element
如果 "garage" 中只有一个 "car",则以下代码会产生错误:
import xmltodict
mydict = xmltodict.parse(xmlstringResults)
for carsInGarage in mydict['garage']['car']:
# do something...
原因是 mydict['garage']['car']
只有在 "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
获取代码 运行。但对于更高级的操作,这不是解决方案。
有人知道可以使用某种函数吗,即使只有一个元素?
这当然不是一种优雅的方式,但这是我为获取代码所做的 运行(如果有人遇到同样的问题并通过 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...
但我想我会再次编写我的代码,"use XML directly" 正如其中一条评论所说。
此问题已在 this issue on Github 中讨论。 xmltodict 包现在支持
d = xmltodict.parse(s, force_list={'car'})
虽然如果该字段不存在,这仍然不会创建空列表。
我正在使用
的组合
1)
json_dict = xmltodict.parse(s, force_list={'item'})
和
2)
# 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
# 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
json_dict = recursive_skip_dict_key_level(json_dict, "item")
json_dict = recursive_remove_none(json_dict)
将任何“项目”XML-elements解释为列表。
除了现有的答案外,xmltodict 现在还支持以下强制 everything 成为列表:
xml = xmltodict.parse(s, force_list=True)
如果 "garage" 中只有一个 "car",则以下代码会产生错误:
import xmltodict
mydict = xmltodict.parse(xmlstringResults)
for carsInGarage in mydict['garage']['car']:
# do something...
原因是 mydict['garage']['car']
只有在 "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
获取代码 运行。但对于更高级的操作,这不是解决方案。
有人知道可以使用某种函数吗,即使只有一个元素?
这当然不是一种优雅的方式,但这是我为获取代码所做的 运行(如果有人遇到同样的问题并通过 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...
但我想我会再次编写我的代码,"use XML directly" 正如其中一条评论所说。
此问题已在 this issue on Github 中讨论。 xmltodict 包现在支持
d = xmltodict.parse(s, force_list={'car'})
虽然如果该字段不存在,这仍然不会创建空列表。
我正在使用
的组合1)
json_dict = xmltodict.parse(s, force_list={'item'})
和
2)
# 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
# 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
json_dict = recursive_skip_dict_key_level(json_dict, "item")
json_dict = recursive_remove_none(json_dict)
将任何“项目”XML-elements解释为列表。
除了现有的答案外,xmltodict 现在还支持以下强制 everything 成为列表:
xml = xmltodict.parse(s, force_list=True)