用 remove_blank_nodes() 清理空白文本节点并显式指定 encoding="utf-8" 可解决空行过多和中文乱码问题;indent 参数控制缩进字符但首行空行需手动 strip(),大文件应换用 lxml.etree。

toPrettyXML 输出空行太多,怎么去掉?
因为 toPrettyXML() 默认把文本节点(比如换行、缩进空格)也当作独立节点处理,一美化就塞满空行。这不是 bug,是 DOM 解析时把原始 XML 里的换行当成了 Text 节点,美化时又给它们加了缩进。
- 最直接的办法:在调用
toPrettyXML()前,递归清理掉所有纯空白的Text节点 - 别用正则删空行——XML 结构可能嵌套,文本内容里也可能有合法换行
- 注意:清理后如果原始 XML 里有带意义的空白(比如
<pre class="brush:php;toolbar:false;"></code> 里的缩进),也会被误杀,得按需保留</li></ul><pre class="brush:php;toolbar:false;"> def remove_blank_nodes(node): if node.nodeType == node.TEXT_NODE and not node.data.strip(): node.parentNode.removeChild(node) else: for child in node.childNodes[:]: # [:] 防止遍历时修改列表 remove_blank_nodes(child) <p>doc = minidom.parse("input.xml") remove_blank_nodes(doc.documentElement) print(doc.toprettyxml(indent=" ", encoding="utf-8").decode())</p></pre><h3>indent 参数不生效,缩进还是 2 个空格?</h3> <p><code>toPrettyXML()的indent参数只控制层级缩进字符串,但默认会把换行符硬编码为\n,且开头多一个换行——这是 CPython 实现细节,不是你传错参数。- 如果你传
indent=" "却看到缩进是 4 空格或制表符,大概率是编辑器自动转换了空格/Tab,或终端显示异常 - 传
indent="\t"是合法的,但某些旧版 Python(如 3.7 之前)对 Tab 处理不稳定,建议坚持用空格 - 无法通过参数去掉首行空行,必须手动
.strip()或切片
中文乱码或报 UnicodeEncodeError?
常见于 Python 3.7 及更早版本:
toPrettyXML()默认用us-ascii编码输出,遇到中文直接崩。
启科网络PHP商城系统下载启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
- 必须显式指定
encoding参数,例如encoding="utf-8" - 返回值类型取决于是否传
encoding:不传 →str;传了 →bytes,别忘了.decode()再打印 - 如果写入文件,别用
print(..., file=f)直接写bytes,会报错;要么用open(..., "wb"),要么 decode 后用"w"模式
性能差、大文件卡死?
minidom是基于 DOM 的全内存解析,toPrettyXML()还要遍历整棵树生成字符串——10MB 以上 XML 就明显吃力。立即学习“Python免费学习笔记(深入)”;
- 不是格式化慢,是整个 DOM 树太重;
minidom本就不适合大文件 - 真要处理大 XML,换
lxml.etree+pretty_print=True,快十倍不止,还支持压缩输出 - 若只能用
minidom,至少避免多次调用toPrettyXML();结果缓存住,别反复生成
实际用的时候,空白清理和编码参数这两个点漏掉一个,输出就不可用。其他问题基本都绕不开这两块。
- 如果你传









