minidom.writexml() 在标签间插入空行是因为默认将换行符注入且保留空白文本节点;解决方法是禁用换行(newl='')、改用toxml()、重写writexml()跳过空白文本节点,或切换至elementtree。

minidom.writexml() 为什么总在标签间插入空行
因为 writexml() 默认用 newl='\n' 换行,且对每个节点(包括文本节点)都调用 write(),而 minidom 在解析时会把原始 XML 中的换行和缩进也当作 Text 节点保留下来——写回时这些“空白文本节点”就变成肉眼可见的空行。
如何让 writexml() 不输出多余空行
核心是绕过默认的格式化逻辑,手动控制换行与缩进。最可靠的做法是禁用自动换行,再用 toprettyxml() 的替代方案(因为它自带空行缺陷),或直接用字符串替换兜底:
- 传入
writexml(..., newl='', encoding='utf-8'),彻底关闭换行符注入 - 用
toxml()替代writexml()获取紧凑 XML 字符串,再按需加缩进(如用xml.dom.minidom.parseString().toprettyxml()后手工清理) - 若必须用
writexml(),需重写Document的writexml()方法,跳过所有仅含空白的Text节点
toxml() vs toprettyxml():哪个更可控
toxml() 输出无换行、无缩进的单行 XML,完全规避空行问题;toprettyxml() 表面美观,实则会在每个元素前后插入空行,且无法通过参数关闭——这是它设计上的硬伤。
-
toxml()返回字符串,可直接写入文件:with open('out.xml', 'w') as f: f.write(doc.toxml()) -
toprettyxml(indent=' ', newl='\n')的newl参数对空行无效,它总在后额外加一行 - 若真要缩进又避空行,先
toxml(),再用正则或第三方库(如xml.etree.ElementTree)重新格式化
用 ElementTree 替代 minidom 写入更省心
不是所有场景都非用 minidom 不可。xml.etree.ElementTree 写入时默认不插空行,且 API 更直观,兼容性好,Python 3.9+ 还支持 xml_declaration=True 和 encoding 直接控制输出。
立即学习“Python免费学习笔记(深入)”;
-
tree.write('out.xml', encoding='utf-8', xml_declaration=True)输出干净无空行 - 若已有
minidom对象,可用minidom解析后转成ElementTree再写(注意命名空间等细节丢失风险) - 特别注意:
minidom的CDATA、注释、处理指令在ElementTree中不被原生支持,这类需求仍得咬牙修writexml()
真正难搞的是带 CDATA 或注释的 XML —— 此时连 toxml() 都可能因节点顺序或空白处理出意外,得逐个检查 childNodes 类型,过滤掉 node.nodeType == node.TEXT_NODE and node.data.strip() == '' 的节点再写入。










