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

toPrettyXML 输出空行太多,怎么去掉?
因为 toPrettyXML() 默认把文本节点(比如换行、缩进空格)也当作独立节点处理,一美化就塞满空行。这不是 bug,是 DOM 解析时把原始 XML 里的换行当成了 Text 节点,美化时又给它们加了缩进。
- 最直接的办法:在调用
toPrettyXML()前,递归清理掉所有纯空白的Text节点 - 别用正则删空行——XML 结构可能嵌套,文本内容里也可能有合法换行
- 注意:清理后如果原始 XML 里有带意义的空白(比如
<pre>里的缩进),也会被误杀,得按需保留
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>indent 参数不生效,缩进还是 2 个空格?
toPrettyXML() 的 indent 参数只控制层级缩进字符串,但默认会把换行符硬编码为 \n,且开头多一个换行——这是 CPython 实现细节,不是你传错参数。
- 如果你传
indent=" "却看到缩进是 4 空格或制表符,大概率是编辑器自动转换了空格/Tab,或终端显示异常 - 传
indent="\t"是合法的,但某些旧版 Python(如 3.7 之前)对 Tab 处理不稳定,建议坚持用空格 - 无法通过参数去掉首行空行,必须手动
.strip()或切片
中文乱码或报 UnicodeEncodeError?
常见于 Python 3.7 及更早版本:toPrettyXML() 默认用 us-ascii 编码输出,遇到中文直接崩。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 必须显式指定
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();结果缓存住,别反复生成
实际用的时候,空白清理和编码参数这两个点漏掉一个,输出就不可用。其他问题基本都绕不开这两块。

















