目前尚不清楚您要使用什么输出格式。这是尝试接近您的代码的一种可能性:
empty = lambda s: not (s and s.strip())
def xml_to_dict(root):
assert empty(root.tail), 'tail is not supported'
d = root.attrib
assert root.tag not in d, 'tag and attribute name conflict'
if len(root) > 0: # has children
assert empty(root.text), 'text and chilren conflict'
d[root.tag] = map(xml_to_dict, root)
elif not empty(root.text):
d[root.tag] = root.text
return d
一般情况下是不可逆的。
例子
import pprint
import xml.etree.ElementTree as etree
xml = """<graphics type='xxx' port='0' autoport='xxx' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
<value>1</value>
<blank/>
</graphics>
"""
pprint.pprint(xml_to_dict(etree.fromstring(xml)))
输出
{'autoport': 'xxx',
'graphics': [{'address': '0.0.0.0', 'type': 'address'}, {'value': '1'}, {}],
'listen': '0.0.0.0',
'port': '0',
'type': 'xxx'}
注意:<listen>
标签名称不在graphics
列表中,<blank/>
而是在列表{}
中。