xmltodict最稳高效,但需处理命名空间、单节点列表化、编码路径、空标签等坑;ElementTree更灵活但代码量大;XML源数据质量差时需先归一化。

Python里用xmltodict转单个XML最稳
直接装xmltodict比手写解析快得多,也比lxml+json组合少踩坑。它把XML树映射成嵌套字典,再喂给json.dumps()就行,结构保留得比较自然。
常见错误现象:xmltodict.parse()遇到带命名空间的XML会吐出一堆@xmlns键,或者把同名兄弟节点变成列表还是字典不一致——这取决于节点数量是否为1。
- 用
process_namespaces=True参数能自动剥离命名空间,避免字段名污染 - 加
force_list=('item', 'entry')明确指定哪些标签名必须转成列表(哪怕只有一个子节点) - 如果XML里有
这种纯文本节点,9.99 xmltodict默认当字符串;想自动转数字,得自己后处理dict,别指望它内置类型推断
批量处理多个XML文件要防编码和路径翻车
Windows上中文路径、Linux下UTF-8缺失、BOM头残留——这些都会让open()读出来乱码,接着xmltodict.parse()直接抛ExpatError。
使用场景:你有一堆data/*.xml,想挨个转成data/json/*.json。
- 统一用
open(path, encoding='utf-8-sig')打开,utf-8-sig能自动吞掉BOM - 路径拼接别用字符串+,改用
pathlib.Path('data').glob('*.xml'),跨平台安全 - 每个文件单独
try/except包住,失败时打印file_path和str(e),别让一个坏文件卡死整批
xml.etree.ElementTree适合需要精细控制的场景
当你发现xmltodict输出的JSON嵌套太深、字段名带@或#text看着难受,或者XML里混着CDATA、注释、处理指令时,就得切到原生ElementTree。
本文档主要讲述的是使用JSON进行网络数据交换传输;JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON的数据格式非常简单,您可以用 JSON 传输一个简单的 St
性能影响:它比xmltodict快约20%–30%,内存占用更低,但代码量翻倍。
- 用
elem.text.strip() if elem.text else None手动清理空白,别信elem.text天然干净 -
elem.attrib是属性字典,想合并进结果得显式赋值,比如result['id'] = elem.get('id') - 遇到
,得决定是存成text {'text': 'text', 'attr': 'v'}还是{'#text': 'text', '@attr': 'v'}——没有标准答案,但整批必须统一
输出JSON时别忽略缩进、排序和空值处理
json.dumps(data, indent=2)看着舒服,但文件大了体积涨30%以上;线上交付常要求紧凑格式,而开发调试又依赖可读性——得留开关。
容易踩的坑:XML里这种空标签,xmltodict转出来是{'phone': None},但很多JSON Schema校验器不认null,得提前过滤掉值为None的字段。
- 加
sort_keys=True能让diff更友好,尤其做版本比对时 - 用
default=str参数兜底无法序列化的对象(比如datetime),否则直接TypeError - 批量写入前先
os.makedirs(output_dir, exist_ok=True),别假设目录一定存在
,有的用1 ,这种得先归一化,不然JSON结构根本没法对齐。









