XML 压缩工具

通过去除空白和注释来压缩 XML

加载示例

XML 输入

压缩后的 XML

本地运行 · 粘贴密钥安全无忧
压缩后的 XML 将显示在此处…

什么是 XML 压缩?

XML 压缩是指在不改变文档含义的前提下,去除 XML 文档中所有多余字符的过程。XML 压缩工具会删除标签之间的空白、去除注释、消除换行符并折叠缩进,从而生成紧凑的单行输出。压缩后的 XML 字符串与原始格式化版本被解析器等价读取,生成完全相同的数据模型。

XML 1.0 规范(W3C 推荐标准,第五版)在第 2.10 节中定义了空白处理规则。标签之间没有语义价值的空白称为「无意义空白」,XML 处理器允许将其丢弃。然而,文本内容中的空白默认是有意义的,除非父元素声明了 xml:space="default"。正确的 XML 压缩工具会区分这两种情况,只删除可以安全去除的部分。

压缩与压缩算法不同。Gzip 或 Brotli 在传输层减小体积,解析前需要解压缩。而压缩则直接减小原始文档体积,使 XML 无需解压步骤即可被任何解析器读取。实践中,先压缩再经压缩算法处理可获得最佳效果:先消除冗余字符,再让压缩算法处理更紧凑的输入。

Before · xml
After · xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Product catalog for Q1 2026 -->
<catalog>
  <product id="p101">
    <name>Widget A</name>
    <price currency="USD">29.99</price>
    <!-- Temporarily discounted -->
    <stock>142</stock>
  </product>
  <product id="p102">
    <name>Widget B</name>
    <price currency="EUR">19.50</price>
    <stock>87</stock>
  </product>
</catalog>
<?xml version="1.0" encoding="UTF-8"?><catalog><product id="p101"><name>Widget A</name><price currency="USD">29.99</price><stock>142</stock></product><product id="p102"><name>Widget B</name><price currency="EUR">19.50</price><stock>87</stock></product></catalog>

为什么使用 XML 压缩工具?

带缩进和注释的格式化 XML 非常适合开发和代码审查。但用于存储、传输和机器消费时,多余的格式只会增加字节数而没有任何好处。XML 压缩工具正好填补了这一差距。

即时减小传输体积
对典型 XML 配置文件去除空白和注释,可将其体积减少 20-40%。对于 SOAP 负载和大型数据订阅,节省量通常超过 30%,有效降低带宽成本和 API 响应时间。
🔒
客户端运行,无需上传
压缩工具使用浏览器原生 DOMParser 在浏览器中运行。不会向服务器发送任何数据,无论 XML 内容为何,处理均在本地进行。
📦
无需注册或安装
粘贴 XML,即可获得压缩输出。无需创建账号,无需安装命令行工具,无需任何依赖。在任何支持现代浏览器的设备上均可使用。
🔧
支持任意格式良好的 XML
支持命名空间、CDATA 节、处理指令和深度嵌套结构。只要输入是格式良好的 XML,压缩工具就能生成有效的压缩输出。

XML 压缩工具使用场景

前端开发
压缩嵌入 HTML 或 CSS 中的 SVG 文件。去除 SVG 标记中的空白和注释可在不影响渲染效果的前提下减小页面体积。即使是普通的 SVG 图标集也能节省数千字节。
后端 API 优化
在向客户端发送前压缩 SOAP 响应和 XML-RPC 负载。压缩后的 XML 解析更快,可降低高吞吐量服务的网络延迟。当响应在传输层尚未压缩时,效果最为显著。
DevOps 与 CI/CD 流水线
在构建流水线中压缩 XML 配置文件(pom.xml、web.xml、.csproj),以减小 Docker 镜像和部署包中的产物体积。更小的镜像意味着更快的拉取速度和更低的容器镜像仓库存储费用。
质量保证与测试
在比较前压缩 XML 测试夹具以规范化格式。去除格式差异可防止因仅有空白变更而导致的误报测试失败。规范化的压缩夹具也让版本控制差异更易审查。
数据工程
在将大型 XML 数据订阅(RSS、Atom、XBRL)存入数据库或消息队列前先进行压缩。更小的负载意味着更低的存储成本和更快的队列吞吐量。大规模场景下,数据量减少 20% 在计算和 I/O 成本上积累效益显著。
学习 XML 结构
学员可以压缩后再重新格式化 XML,从而理解解析器如何忽略无意义空白,以及为何文档结构与其视觉格式相互独立。这一练习使抽象的规范规则变得具体且直观可见。

XML 压缩可去除的内容

并非 XML 文档中的所有内容都可以安全去除。下表列出了每种可移除内容的类型,以及丢弃它是否始终安全或取决于具体使用场景。

内容类型示例安全性
IndentationSpaces/tabs before tagsAlways safe to remove
Line breaks\n and \r\n between tagsAlways safe to remove
Comments<!-- ... -->Safe unless parsed by app
XML declaration<?xml version="1.0"?>Keep if encoding is non-UTF-8
Processing instructions<?xml-stylesheet ...?>Keep if consumed downstream
Trailing whitespaceSpaces after closing tagsAlways safe to remove
Text node whitespaceSpaces inside text contentRemove only between tags, not within

压缩 vs Gzip vs 二进制格式

压缩、压缩算法和二进制编码各自针对体积问题的不同层面。压缩将输出保持为有效、人类可读的 XML。压缩算法(Gzip、Brotli)可进一步缩小体积,但解析前需要解压步骤。二进制格式压缩效果最强,但连接两端都需要兼容的编码/解码器——主要用于嵌入式系统或大量使用 WSDL 的企业级服务。

XML 压缩
去除无意义空白、注释和换行符。输出仍为有效 XML,可被任何解析器读取。典型压缩率:20-40%。无需解压步骤。
Gzip / Brotli 压缩
对字节流应用压缩算法。在压缩基础上典型再降低 60-80%。解析前需要解压步骤。通过 Content-Encoding 实现 HTTP 标准压缩传输。
二进制格式(EXI、Fast Infoset)
以二进制表示形式编码 XML 信息集。典型压缩率:80-95%。连接两端需要兼容的编码/解码器。用于嵌入式系统和大量使用 WSDL 的服务等受限环境。

代码示例

以编程方式压缩 XML 在各语言中遵循相同模式:将文档解析为树形结构,可选地删除注释节点,然后不带缩进地序列化输出。

JavaScript (browser)
// Minify XML by parsing and re-serializing (strips formatting)
const raw = `<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>`

const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')

// Remove comment nodes
const walker = doc.createTreeWalker(doc, NodeFilter.SHOW_COMMENT)
const comments = []
while (walker.nextNode()) comments.push(walker.currentNode)
comments.forEach(c => c.parentNode.removeChild(c))

const minified = new XMLSerializer().serializeToString(doc)
// → "<root><item id=\"1\"><name>Test</name></item></root>"
Python
from lxml import etree

xml = """<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>"""

tree = etree.fromstring(xml.encode())

# Remove comments
for comment in tree.iter(etree.Comment):
    comment.getparent().remove(comment)

# Serialize without pretty-print (minified)
result = etree.tostring(tree, xml_declaration=False).decode()
# → '<root><item id="1"><name>Test</name></item></root>'

# With xml.etree (stdlib, no lxml needed)
import xml.etree.ElementTree as ET
root = ET.fromstring(xml)
ET.indent(root, space='')  # Python 3.9+
print(ET.tostring(root, encoding='unicode'))
Go
package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

func minifyXML(input string) (string, error) {
    decoder := xml.NewDecoder(strings.NewReader(input))
    var out strings.Builder
    encoder := xml.NewEncoder(&out)
    // No indentation = minified output
    for {
        tok, err := decoder.Token()
        if err != nil {
            break
        }
        // Skip comments
        if _, ok := tok.(xml.Comment); ok {
            continue
        }
        // Skip whitespace-only char data
        if cd, ok := tok.(xml.CharData); ok {
            if strings.TrimSpace(string(cd)) == "" {
                continue
            }
        }
        encoder.EncodeToken(tok)
    }
    encoder.Flush()
    return out.String(), nil
}
// minifyXML("<a>\n  <b>1</b>\n</a>") → "<a><b>1</b></a>"
CLI (xmllint)
# Minify XML with xmllint (part of libxml2)
xmllint --noblanks input.xml > minified.xml

# Minify from stdin
echo '<root>
  <item>hello</item>
</root>' | xmllint --noblanks -
# → <?xml version="1.0"?><root><item>hello</item></root>

# Strip comments too (combine with sed or xmlstarlet)
xmlstarlet ed -d '//comment()' input.xml | xmllint --noblanks -

# Check size reduction
echo "Before: $(wc -c < input.xml) bytes"
echo "After:  $(xmllint --noblanks input.xml | wc -c) bytes"

常见问题

压缩后的 XML 仍然是有效的 XML 吗?
是的。压缩只删除无意义的空白和注释。生成的文档与原始文档遵循相同的 XML 1.0 或 1.1 规范。任何符合规范的解析器都会从格式化版本和压缩版本中生成相同的数据模型。
XML 压缩后能缩小多少?
节省量取决于原始文档的格式化程度。大量缩进且含注释的 XML 通常可缩小 20-40%。已经较为紧凑的文档可能只减少 5-10%。比较输入和输出的字节数即可测量确切的压缩率。
压缩会破坏我的 XML 吗?
如果压缩工具只去除标签之间的空白(无意义空白)和注释,文档语义保持不变。唯一的边界情况是 xml:space="preserve" 区域,其中文本节点内的空白是有意义的。正确的压缩工具会遵守此指令并保持这些区域不变。
XML 压缩与 XML 压缩算法有什么区别?
压缩是通过去除不携带数据的字符来编辑 XML 文本本身。压缩算法(Gzip、Brotli)则将整个字节流编码为更小的二进制格式,解析前必须先解压。两者是互补的:先压缩,再经压缩算法传输。
应该在将 XML 存入数据库前先压缩吗?
对于大量 XML 数据,存储前压缩可减少磁盘占用并加快读取速度。对于开发人员手动编辑的配置文件或模板,应存储格式化版本,在构建时或传输时再进行压缩。需要权衡可读性与存储效率。对于需要审计、在版本控制中进行差异对比或由运维团队手动更新的 XML,应避免压缩——这些场景下保留格式节省的时间远比存储节省更有价值。
xmllint 支持压缩吗?
支持。运行 xmllint --noblanks input.xml 可去除无意义空白。默认情况下不会删除注释。如需同时删除注释,可先通过 xmlstarlet ed -d '//comment()' 进行管道处理,或使用自定义 XSLT 去除注释节点。
压缩对 XML 解析性能有何影响?
压缩后的 XML 解析更快,因为解析器处理的字节更少,也不会遇到仅含空白的文本节点。在大型文档(1 MB 以上)和流式解析器中差异最为明显,因为每个额外节点都会增加遍历开销。