xmllint --format 是最稳的XML格式化方案,本地运行避免泄露与错乱,支持BOM检测、DTD处理及命名空间保留,而网页工具和Python标准库易出错。

XML 格式化用 xmllint 最稳,别信网页工具
本地有 xmllint 就别粘贴到在线工具里——敏感字段泄露、格式错乱、DOCTYPE 消失都是常态。它内置在大多数 Linux/macOS 系统中,Windows 可通过 WSL 或 Git Bash 使用。
-
xmllint --format是唯一可靠的一键美化命令,不改内容语义,只调整缩进与换行 - 如果报错
XML declaration not well-formed,大概率是开头多了 BOM 或空格,先用head -c 10 file.xml | hexdump -C查 - 含 DTD 或外部实体时,加
--noblanks --dropdtd避免解析失败;但--dropdtd会删掉<!DOCTYPE>,要保留就得用--loaddtd+--nocatalog - 美化后体积可能增大 3–5 倍,别用在日志或传输场景;压缩应另走
xmlstar或 XSLT 去空格路径
在线工具崩坏的三个典型表现
不是所有“XML 格式化”按钮都调用了真实解析器。很多前端工具只是正则替换,遇到 CDATA、注释嵌套、命名空间前缀就直接乱套。
- 把
<![CDATA[<tag>hello</tag>]]></tag>拆成多行并错误闭合标签 - 将
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">中的冒号前缀识别为非法字符而删除 - 把注释
<!-- 多行注释\n第二行 -->压成一行导致后续节点错位 - 不校验编码声明,UTF-8 文件若声明为
encoding="gb2312",直接解析失败且无提示
Python 里用 xml.etree.ElementTree 美化要绕开两个坑
它默认不保留原始缩进和空白,也不处理 CDATA;想“看起来整齐”,得自己补逻辑,不是调个 toprettyxml() 就完事。
-
minidom.toprettyxml()会在每行末尾加多余换行,必须用replace('\n', '')清洗,但会误杀文本内容里的换行 -
ElementTree写入前需手动遍历设置tail和text属性,否则子元素全挤在一行 - 带命名空间的 XML(如
xmlns:ns="http://example.com")必须提前注册register_namespace(),否则前缀被丢、生成ns0:这种临时名 - 不要用
parse()直接读取含<!ENTITY>的文件,会报xml.parsers.expat.ExpatError: undefined entity,得换lxml.etree+resolve_entities=False
压缩 XML 实际就是删空白,但不能瞎删
所谓“压缩”不是 gzip,而是移除人眼不需要的空格、换行、缩进。但 <pre> 里的空格、属性值首尾空格、文本节点中间空格,删了就变语义。
- 安全做法:用
xmlstar --delete '//text()[normalize-space()=""]'删纯空白文本节点,比正则靠谱 - 若用正则
re.sub(r'>\s+,会吃掉 <code><![CDATA[ hello ]]>里的空格 -
xml.format类库(如 Python 的xmlformatter)默认开启strip_cdata,一开就把 CDATA 内容全 trim 了,关掉才保险 - HTTP 传输前建议用
gzip,而不是靠删空格省几 KB;后者破坏可读性,前者零语义风险
事情说清了就结束。真正难的不是怎么格式化,是怎么判断哪部分空白能动、哪段命名空间声明动了会断下游解析——这得看 Schema 或接口文档,不是工具能猜的。







