xmltodict.parse() 将 xml 转为嵌套字典,需注意:重复标签需 force_list 指定;属性默认为 @attr,文本为 #text;须传字符串或文件对象,非路径;ordereddict 需 dict_constructor=dict 或 json.dumps(..., default=dict);非法 key 用 postprocessor 清洗。

xmltodict.parse() 是最直接的转换入口
它把 XML 字符串或文件流变成嵌套字典,结构基本保留层级和属性。注意:默认不保留重复标签的列表特性,同名子节点多个时会被覆盖成单个字典 —— 这是第一个掉坑点。
- 用
xmltodict.parse()时,如果原始 XML 有多个<item></item>并列,必须加参数force_list=('item',),否则只留最后一个 - 属性默认转成
@attr键名(比如<tag id="123"></tag>→{'@id': '123'}),不想带@前缀得配attr_prefix='' - 文本内容默认塞进
#text键(比如<name>Alice</name>→{'#text': 'Alice'}),想扁平化要加text_key=''
读取文件别直接传路径,先 open 再 parse
xmltodict.parse() 只接受字符串或类文件对象,不支持直接传 "data.xml" 路径。常见报错 TypeError: expected string or bytes-like object 就出在这儿。
- 正确写法:
with open('data.xml', 'r', encoding='utf-8') as f: data = xmltodict.parse(f.read()) - 大文件慎用
.read(),可用xmltodict.parse(f)(传 file 对象本身也行,库内部会调.read()) - 编码错误(如
UnicodeDecodeError)大概率是 XML 声明里写encoding="GBK",但 Python 默认按 UTF-8 打开,得匹配声明编码
转完的字典含 OrderedDict,JSON 序列化前要处理
旧版 xmltodict 默认返回 collections.OrderedDict,而 json.dumps() 不认它,会抛 TypeError: Object of type OrderedDict is not JSON serializable。
- 方案一:升级到
xmltodict >= 0.13.0,加参数dict_constructor=dict直接用普通dict - 方案二:降级兼容,用
json.dumps(data, default=dict)让 JSON 模块遇到OrderedDict就转成dict - 注意:即使用了
dict_constructor=dict,嵌套里的 list 元素仍是原样,不用额外处理
特殊字符和命名冲突得靠 postprocessor
XML 里有非法 JSON key 名(比如数字开头、含空格、- 符号)时,转出的字典 key 会原样保留,导致后续用 data.user-name 这种访问失败,或者 JSON dump 后字段名不符合下游要求。
立即学习“Python免费学习笔记(深入)”;
- 用
postprocessor参数自定义键名清洗逻辑,例如把-换成_:lambda path, key, value: (key.replace('-', '_'), value) - path 是元组形式的层级路径(如
('root', 'user-info', '@id')),可用于条件判断是否在特定节点下改名 - 别忘了
postprocessor也要返回(new_key, new_value)二元组,漏返或返错类型会崩
parse() 的参数里提前对齐,而不是等 JSON 出来再遍历改。










