Pretty Print 是将紧凑的 XML/JSON/HTML 字符串转为缩进换行的可读格式,不改变内容;Python 可用 minidom.toprettyxml()(轻量但不保留注释)或 ElementTree+minidom 组合(更健壮),命令行推荐 xmllint。

什么是 Pretty Print(格式化输出)
Pretty Print 指的是将原本紧凑、无换行、无缩进的 XML(或 JSON、HTML 等)字符串,转换为人类可读的、带缩进和换行的结构化文本。它不改变数据内容,只调整排版——比如把 变成多行缩进形式。
Python 用 xml.dom.minidom 实现 Pretty Print
这是标准库中最轻量、无需安装依赖的方式,适合简单 XML 字符串美化。注意:minidom 不保留注释和处理指令,且对非法/不规范 XML 容错性差。
- 必须先用
parseString()或parse()加载为 DOM 对象,再调用toprettyxml() -
toprettyxml(indent=" ", newl="\n", encoding=None)的indent默认是两个空格,newl控制换行符 - 常见坑:
toprettyxml()会在每行末尾加空行(因节点间文本节点被视为空白),需用正则清理
from xml.dom import minidomxml_str = '
' dom = minidom.parseString(xml_str) pretty_xml = dom.toprettyxml(indent=" ", newl="\n") - A
- B
清理多余空行
clean_xml = "\n".join([line for line in pretty_xml.split("\n") if line.strip()]) print(clean_xml)
Python 用 xml.etree.ElementTree + xml.dom.minidom 组合方案
当需要保留命名空间、更健壮地解析(比如含 CDATA 或特殊字符),推荐先用 ElementTree 解析,再转给 minidom 格式化——因为 ElementTree 本身没有内置 pretty print 方法。
-
ElementTree.tostring()输出的是 bytes,需 decode 成 str 后再喂给minidom.parseString() - 若原始 XML 有编码声明(如
),toprettyxml()会重复写入,建议设encoding=None并手动加声明 - 对大文件慎用:DOM 方式会全量加载到内存
import xml.etree.ElementTree as ET from xml.dom import minidomroot = ET.fromstring('
') rough_string = ET.tostring(root, encoding="unicode") reparsed = minidom.parseString(rough_string) pretty = reparsed.toprettyxml(indent=" ", newl="\n", encoding=None) print("\n".join(s for s in pretty.split("\n") if s.strip())) - hello
命令行用 xmllint 快速美化本地 XML 文件
开发调试时最省事的方式:不用写代码,直接 shell 调用系统工具。前提是已安装 xmllint(Linux/macOS 通常随 libxml2 提供,Windows 可通过 Chocolatey 或手动下载)。
- 基础命令:
xmllint --format input.xml,输出到终端;加--output output.xml可保存 - 若 XML 编码不是 UTF-8,可能报错,加
--encode utf-8强制转码 - 注意:如果 XML 有 DTD 或 XSD 引用且网络不可达,
xmllint可能卡住或失败,加--noblanks或--dropdtd视情况绕过
实际执行示例:
$ xmllint --format --encode utf-8 data.xml > formatted.xml
真正麻烦的不是选哪个方法,而是 XML 是否良构——哪怕少一个闭合标签,所有美化工具都会抛异常。动手前先用 xmllint --noout file.xml 或 Python 的 ET.parse() 做一次校验,比反复调试格式化逻辑省十倍时间。










