1

我正在解析 XMLxmltodictforce_list=('xml_tag')获取 XML 列表中单个元素的列表。它有效!但是,如果xml_tag没有孩子,它会返回一个[None](带有单个None对象的列表)。如何预防?

XML

<Something>
    <Guitar>
        <name>Walden</name>
        <strings>5</strings>
    </Guitar>
    <Pokemons>
    </Pokemons>
</Something>

PYTHON

res = xmltodict.parse(xml, force_list=('Pokemons',))

res = res['Something']['Guitar']['Pokemons']

pprint(res)

>>> [None]

有什么建议么?

[更新]

对不起,我没有澄清我想要什么。我想得到空列表,因为结果不是带有 None 元素的列表

4

2 回答 2

1

您可以将后处理函数传递给 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))

输出:

{
  "Something": {
    "Guitar": {
      "name": "Walden",
      "strings": "5"
    },
    "Pokemons": []
  }
}
于 2019-10-09T21:27:59.733 回答
0

xmltodict.parse(使用 force_list arg)将 xml 转换为OrderedDict带有标签的键,无论节点是否为空(如果空节点None值存储在 dict 中)。

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

要过滤 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
>>> []
于 2019-10-09T12:43:46.630 回答