Python 带force_list参数的xmltodict为空XML列表返回一个无元素的列表

Python 带force_list参数的xmltodict为空XML列表返回一个无元素的列表,python,parsing,xmltodict,Python,Parsing,Xmltodict,我使用带有force_list='XML_tag'的xmltodict解析XML,以便获得XML列表中单个元素的列表。而且它有效!但是,如果xml_标记没有子对象,它将返回一个带有单个None对象的[None]列表。如何预防 XML 有什么建议吗 [更新] 对不起,我没有澄清我想要什么。 我希望得到空列表作为结果,而不是包含None元素的列表。使用force_list arg解析将xml转换为带标记的OrderedDict,无论节点是否为空,如果节点为空,dict中都不会存储任何值 因此,您必须

我使用带有force_list='XML_tag'的xmltodict解析XML,以便获得XML列表中单个元素的列表。而且它有效!但是,如果xml_标记没有子对象,它将返回一个带有单个None对象的[None]列表。如何预防

XML

有什么建议吗

[更新]

对不起,我没有澄清我想要什么。 我希望得到空列表作为结果,而不是包含None元素的列表。使用force_list arg解析将xml转换为带标记的OrderedDict,无论节点是否为空,如果节点为空,dict中都不会存储任何值

因此,您必须自己过滤dict结果

要筛选dict,您可以定义自定义方法:

def filter_dict(item):
    if not item:
        return ''
    elif isinstance(item, list):
        return [it for it in item if it]
    elif not hasattr(item, 'items'):
        return item
    else:
        return {key: filter_dict(value) for key, value in item.items()}


>>> res = xmltodict.parse(xml, force_list=('Pokemons',))
>>> res = filter_dict(res)
>>> pokemons = res['Something']['Pokemons']
>>> pokemons
>>> []

您可以将后处理函数传递给xmltodict,这允许您修改dict值。 但后处理需要返回一个键和一个值:

import xmltodict
import json


def postprocessor(path, key, value):
    if key == 'Pokemons' and not value:
        return key, []
    return key, value

xml = """<Something>
    <Guitar>
        <name>Walden</name>
        <strings>5</strings>
    </Guitar>
    <Pokemons>
    </Pokemons>
</Something>"""


res = xmltodict.parse(xml, postprocessor=postprocessor)
print(json.dumps(res, indent=2, sort_keys=True))

您想要阻止什么,有无、无或值的列表?
def filter_dict(item):
    if not item:
        return ''
    elif isinstance(item, list):
        return [it for it in item if it]
    elif not hasattr(item, 'items'):
        return item
    else:
        return {key: filter_dict(value) for key, value in item.items()}


>>> res = xmltodict.parse(xml, force_list=('Pokemons',))
>>> res = filter_dict(res)
>>> pokemons = res['Something']['Pokemons']
>>> pokemons
>>> []
import xmltodict
import json


def postprocessor(path, key, value):
    if key == 'Pokemons' and not value:
        return key, []
    return key, value

xml = """<Something>
    <Guitar>
        <name>Walden</name>
        <strings>5</strings>
    </Guitar>
    <Pokemons>
    </Pokemons>
</Something>"""


res = xmltodict.parse(xml, postprocessor=postprocessor)
print(json.dumps(res, indent=2, sort_keys=True))
{
  "Something": {
    "Guitar": {
      "name": "Walden",
      "strings": "5"
    },
    "Pokemons": []
  }
}