格式化 XML
私密和安全
一切都在您的浏览器中进行。您的文件绝不接触我们的服务器。
极速
无需上传,无需等待。在您拖放文件的瞬间即可转换。
完全免费
无需帐户。无隐藏费用。无文件大小限制花招。
XML(可扩展标记语言)已经存在了 25 年多,但它仍然深深嵌入现代软件的基础设施中:从 Office 文档和 Android 布局到 SOAP API、RSS 订阅源、配置文件和数字保存工作流。它不再是宠儿——那个桂冠已经属于 JSON——但 XML 在需要严格结构、丰富元数据和长期互操作性的地方仍然至关重要。本文的目标是全面解释 XML:它的来源、工作原理、我们如何处理和验证它、它与更新格式的比较,以及如何在 2025 年及以后安全有效地使用它。
1. XML 实际上是什么
XML 是一种简化的标记语言,用于使用嵌套元素和属性来表示结构化数据和文档。它由万维网联盟的 可扩展标记语言 (XML) 1.0 建议 定义,该建议规定了格式良好的 XML 文档的语法,并描述了处理器应如何处理它们。
XML 规范将 XML 描述为 SGML(标准通用标记语言)的受限子集,旨在更易于实现,同时保留 SGML 的核心能力:使用显式标记表示结构化文本。
一些关键特性使 XML 与众不同:
- 基于文本且支持 Unicode。 XML 文档是纯文本,依赖于 Unicode/ISO 10646 字符集,这使得它们具有可移植性和语言独立性。
- 自描述。 标签名称和属性带有含义。不需要单独的架构即可基本理解结构(尽管架构使其功能更强大)。
- 层次结构。 XML 的树结构直接映射到嵌套数据、文档和配置层次结构。
- 可扩展。 您可以发明自己的标签和词汇表;XML 本身不固定允许的元素集合。
2. 简史:从 SGML 到 XML 再到现代网络
XML 的根源在于 SGML,这是 20 世纪 80 年代的 ISO 标准,在出版和技术文档中大量使用。到了 20 世纪 90 年代中期,网络的 HTML(本身基于 SGML)无处不在,但过于局限且与表示紧密耦合。
大约在 1996–1997 年,一个包括 Jon Bosak、Tim Bray、C. M. Sperberg-McQueen、James Clark 等人的工作组开始设计一个更简单、适合网络的 SGML 子集,可以轻松可靠地解析。第一个 XML 1.0 建议于 1998 年发布,XML 迅速成为许多早期网络标准和协议的基础,包括 SOAP、WSDL、SVG、XSLT 和众多特定行业的词汇表。
后来,XML 1.1 改进了一些字符处理和控制字符的边缘情况,但 XML 1.0 在实践中仍然是主要变体。
3. 核心 XML 语法:格式良好的文档
XML 1.0 规范为格式良好的文档定义了精确的语法。至少,格式良好的 XML 文档:
- 恰好有一个根元素。
- 使用匹配的开始和结束标签。
- 正确嵌套元素(没有重叠标签)。
- 使用带引号的属性值。
- 使用合法字符和编码。
一个微小但有效的文档可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>George</to>
<from>Adam</from>
<message>Hello XML!</message>
</note>XML 声明是可选的,但它是声明版本和字符编码的常规方式。文档元素 <note> 是唯一的根。文本节点、元素、属性、注释、处理指令和实体引用共同构成规范中描述的树结构。
XML 还区分 格式良好的和 有效的文档:
- 格式良好的文档遵循语法规则。
- 有效的文档另外符合限制其结构和内容的 DTD 或架构。
4. 命名空间:安全地混合词汇表
随着 XML 词汇表的增多,名称冲突成为一个问题:一个词汇表可能使用 <title> 表示书名;另一个表示职位头衔。为了避免冲突,XML 引入了 命名空间,在 W3C 建议 XML 中的命名空间 中定义。
例如:
<book xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>XML in Depth</dc:title>
</book>在这里,dc:title 通过将 dc 前缀绑定到都柏林核心命名空间 URI,可以安全地与任何其他 <title> 元素区分开来。命名空间在现代 XML 生态系统中至关重要:XSD、XSLT、SOAP、RSS 和 Office Open XML 都严重依赖它们。
5. 验证:DTD、XML Schema 等
5.1 DTD
原始 XML 规范包括 文档类型定义 (DTD) 作为定义文档允许结构的规范方法——允许的元素、属性、实体等。DTD 紧凑且很好地集成到 XML 序言中,但它们有局限性:使用非 XML 语法,类型化较弱,并且难以处理命名空间。
5.2 XML Schema (XSD)
为了解决 DTD 的限制,W3C 在 XML Schema Definition Language (XSD) 1.1 Part 1: Structures 中标准化了 XML Schema Definition (XSD),现在版本为 1.1。XSD 本身用 XML 编写,支持命名空间,并提供丰富的类型化(字符串、数字、日期、列表、联合)、出现约束和复杂的内容模型。
存在其他架构语言——如 RELAX NG 和 Schematron——但 XSD 在许多企业和标准驱动的环境中仍然是事实上的标准。
5.3 为什么验证很重要
验证将 XML 从结构化文本转换为系统之间的 合同。例如:
- 金融消息传递规范为支付指令定义严格的架构。
- Office Open XML 和 RSS 等标准使用架构形式化其文档格式。
- 构建和配置工具验证
pom.xml或web.config等文件以尽早发现错误。
6. 处理 XML:DOM、SAX 和流式处理
XML 本身只是文本。要做任何有用的事情,软件必须将其解析为某种模型。两种经典的处理模型是 DOM 和 SAX。
6.1 DOM:内存中的树
W3C 的 DOM Level 3 Core 规范 定义了一个语言中性的对象模型,表示整个文档树,包含元素、属性、文本、注释等的节点。DOM 对随机访问友好,易于推理,并在库中得到广泛支持,但它需要将整个文档保存在内存中。
6.2 SAX:事件驱动的流式处理
Simple API for XML (SAX) 是一个事件驱动的 API,将 XML 作为流解析,并为诸如 "开始元素"或 "结束元素"等事件触发回调。它在 SAX 项目网站 和 Oracle SAX 教程 中描述。
SAX 在单次遍历中处理文档,而不存储整个树,这使得它在内存方面极其高效,非常适合大型流,如日志、消息处理或批量转换。基于拉取的流式 API(如 StAX)遵循类似的原则。
7. XPath、XSLT 和 XQuery:查询和转换 XML
7.1 XPath
XPath 是一种紧凑的查询语言,用于使用类似路径的表达式(如 /bookstore/book[1]/title)来寻址 XML 文档的各个部分。最新版本在 XPath 3.1 中定义,扩展了模型以通过映射和数组处理 JSON 数据,并得到大量标准函数的支持。
XPath 嵌入在许多工具中:XSLT、XQuery、XML Schema 断言以及流行编程语言中的 API。
7.2 XSLT
XSL Transformations (XSLT) 是一种声明性语言,用于将 XML 转换为其他格式——XML、HTML、文本,甚至在现代处理器中转换为 JSON。W3C 的 XSLT 3.0 建议 定义了一个基于模板的系统,依赖 XPath 进行模式匹配和选择。
样式表本身是使用 XSLT 命名空间的 XML 文档。XSLT 3.0 为大型文档添加了流式处理功能,并改进了与 JSON 和映射的集成。
7.3 XQuery
XQuery 是用于 XML 存储库的完整查询语言,在 XQuery 3.1 中定义。它设计用于查询和转换 XML 数据集合,通常存储在原生 XML 数据库或文档存储中,并使用 FLWOR 表达式(for、let、 where、order by、return)生成强大的结果集。
XPath、XSLT 和 XQuery 共同构成了一个丰富的工具包,用于大规模处理 XML,特别是在出版、数字人文、电子政务和数据集成环境中。
8. XML 在当今的实际用途
即使 JSON 主导了 Web API,XML 仍然深深嵌入许多系统和标准中。
8.1 文档格式和标准
- Office Open XML (OOXML)。 现代 Microsoft Office 文档(
.docx、.xlsx、.pptx)是由 ECMA-376 Office Open XML 和相关 ISO 标准定义的 XML 文件的 ZIP 包。 - 数字保存。 国会图书馆等机构将 XML(特别是 XML 1.0)视为表示结构化数字内容的稳定、有利于保存的格式。
- 学术和技术标记。 TEI、DocBook 和其他特定领域的词汇表基于 XML,支持语义标记和长期归档。
8.2 消息传递和 Web 服务
- SOAP。 W3C 的 SOAP 1.2 规范定义了基于 XML 的信封,用于通过 HTTP 等协议交换结构化消息。
- RSS 和联合。 RSS 2.0 规范 定义了用于订阅源联合的 XML 格式,仍广泛用于博客、新闻和产品订阅源。
8.3 配置和构建系统
- Maven POM。 Apache Maven 的项目对象模型(
pom.xml)是一个 XML 文件,描述项目元数据、依赖项、插件和构建配置,在 POM 参考 和 POM 简介 中记录。 - Spring Framework XML 配置。 传统的 Spring 应用程序通常在
applicationContext.xml或beans.xml文件中定义 bean 和连接,这种方法仍在 Spring 参考文档 和 Java Guides 等教程中描述。 - .NET 配置。 ASP.NET 和 WCF 依赖格式化为 XML 的
web.config和app.config文件来配置端点、绑定和行为,如 Microsoft 的 web.config 文档 和 WCF 配置指南 中所述。
更一般地说,当验证和工具很重要时,XML 仍然是常见的配置格式,特别是对于由 XSD 支持的架构。
8.4 移动和 UI 布局
在 Android 中,UI 布局通常在 res/layout 下的 XML 文件中声明。Google 的文档解释说,您使用 Android 的 XML 词汇表编写布局,以嵌套视图,非常类似于 HTML,每个布局文件包含一个根元素。
9. XML vs JSON vs YAML
到 2025 年,JSON 显然赢得了 Web API 的受欢迎程度竞赛:最近的一篇比较文章估计 JSON 约占 Web API 响应的 87%,XML 占 9%,YAML 占 4%。
9.1 XML 的优势
与 JSON 和 YAML 相比,XML 在您需要以下内容时表现出色:
- 丰富的架构和强大的验证。 XSD 允许您指定复杂类型、约束和关系,并拥有成熟的工具和验证器生态系统。
- 混合内容和文档。 XML 是为文本丰富的文档而构建的,其中标记和文本交错;JSON 和 YAML 更适合纯结构化数据。
- 深度元数据和可扩展性。 命名空间和架构允许版本容错文档,可以在不破坏较旧使用者的情况下添加可选元素和属性。
9.2 JSON 和 YAML 的优势
JSON 更易于读写,自然地映射到 JavaScript 对象,并且在传输中更小。教程经常指出,JSON 省略结束标签,更简洁,并且可以在浏览器中本地解析,而无需专用的 XML 解析器。
YAML 强调配置的人类可读性,在 Kubernetes 和 Ansible 等 DevOps 工具中很受欢迎,尽管其复杂性和对缩进的敏感性可能会引入错误。
9.3 选择正确的格式
现代指南倾向于:
- 对于大多数 Web API 和客户端-服务器通信,使用 JSON。
- 在云/DevOps 环境中,对于以开发人员为中心的 配置,使用 YAML。
- 当您需要基于架构的文档、混合内容、现有 XML 生态系统(SOAP、OOXML、WCF、Android 布局)或标准化和工具成熟的长期归档时,使用 XML。
10. 安全性:XXE 和其他 XML 陷阱
XML 的灵活性伴随着尖锐的边缘,特别是在外部实体和 DTD 方面。OWASP 的 XML External Entity (XXE) 预防备忘单 记录了 XXE 漏洞如何允许攻击者读取本地文件、执行服务器端请求伪造,或通过利用实体扩展导致拒绝服务。
常见的攻击向量包括:
- 引用本地或远程资源的外部实体。
- DTD 中扩展为巨大有效负载的参数实体。
- 通过不受信任的网络检索 DTD。
缓解指南通常建议:
- 尽可能在解析器中禁用 DTD 和外部实体。
- 使用硬化的解析器设置或遵循 OWASP 建议的安全库。
- 针对架构进行验证,而不启用有风险的功能。
其他安全考虑包括超大文档(资源耗尽)、从用户输入构建查询的系统中 XPath/XQuery 注入,以及配置错误的基于 XML 的配置文件导致权限提升或代码执行。
11. XML 的设计和最佳实践
如果使用得当,XML 仍然是建模数据和文档的干净、稳健的方法。一些实用指南:
- 建模清晰的树。 围绕稳定的概念树(例如,
<invoice>→<lineItems>→<lineItem>)设计您的 XML,而不是直接反映关系架构。 - 有意选择元素与属性。 对主要内容和结构使用元素;对元数据和标志使用属性。
- 从一开始就使用命名空间。