Pretty Print是什么 如何用代码美化输出的XML

3次阅读

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

Pretty Print是什么 如何用代码美化输出的XML

什么是 Pretty Print(格式化输出

Pretty Print 指的是将原本紧凑、无换行、无缩进的 XML(或 json、HTML 等)字符串,转换为人类可读的、带缩进和换行的结构化文本。它不改变数据内容,只调整排版——比如把 12 变成多行缩进形式。

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 minidom 

xml_str = 'AB' dom = minidom.parseString(xml_str) pretty_xml = dom.toprettyxml(indent=" ", newl="n")

清理多余空行

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 minidom 

root = ET.fromstring('hello') 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()))

命令行用 xmllint 快速美化本地 XML 文件

开发调试时最省事的方式:不用写代码,直接 shell 调用系统工具。前提是已安装 xmllintlinux/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() 做一次校验,比反复调试格式化逻辑省十倍时间。

text=ZqhQzanResources