如何使用Python xml.dom.minidom避免在写入XML文件时产生多余空行?
- 内容介绍
- 相关推荐
本文共计732个文字,预计阅读时间需要3分钟。
由于使用`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参数对空行无效,它总在</tag>后额外加一行 - 若真要缩进又避空行,先
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() == '' 的节点再写入。
本文共计732个文字,预计阅读时间需要3分钟。
由于使用`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参数对空行无效,它总在</tag>后额外加一行 - 若真要缩进又避空行,先
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() == '' 的节点再写入。

