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 声明是可选的,但它是声明版本和字符编码的常规方式。文档元素
XML 还区分 格式良好的和 有效的文档:
格式良好的文档遵循语法规则。有效的文档另外符合限制其结构和内容的 DTD 或架构。4. 命名空间:安全地混合词汇表随着 XML 词汇表的增多,名称冲突成为一个问题:一个词汇表可能使用
例如:
在这里,dc:title 通过将 dc 前缀绑定到都柏林核心命名空间 URI,可以安全地与任何其他
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:查询和转换 XML7.1 XPathXPath 是一种紧凑的查询语言,用于使用类似路径的表达式(如 /bookstore/book[1]/title)来寻址 XML 文档的各个部分。最新版本在 XPath 3.1 中定义,扩展了模型以通过映射和数组处理 JSON 数据,并得到大量标准函数的支持。
XPath 嵌入在许多工具中:XSLT、XQuery、XML Schema 断言以及流行编程语言中的 API。
7.2 XSLTXSL Transformations (XSLT) 是一种声明性语言,用于将 XML 转换为其他格式——XML、HTML、文本,甚至在现代处理器中转换为 JSON。W3C 的 XSLT 3.0 建议 定义了一个基于模板的系统,依赖 XPath 进行模式匹配和选择。
样式表本身是使用 XSLT 命名空间的 XML 文档。XSLT 3.0 为大型文档添加了流式处理功能,并改进了与 JSON 和映射的集成。
7.3 XQueryXQuery 是用于 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 仍然是建模数据和文档的干净、稳健的方法。一些实用指南:
建模清晰的树。 围绕稳定的概念树(例如,
W3C 和 Ecma 等标准机构仍然维护基于 XML 的规范,如 XML 1.x、XML Schema、XPath、XSLT、XQuery、SOAP 和 OOXML,国会图书馆等机构继续将 XML 视为归档的主力。
对于开发人员来说,这意味着每当您接触 Office 文件、Android 布局、许多 Java 企业堆栈、.NET 配置、较旧的 SOAP/WSDL 服务或标准驱动的数据交换时,您都可能与 XML 交互。理解 XML 的语法、命名空间、架构和处理模型仍然是一项宝贵的技能,特别是如果您在集成、基础设施或长期系统中工作。
XML 可能不再是现代 Web API 的明星,但它仍然是大量软件的坚实、规范良好且工具丰富的 foundation。深入学习它,每当您需要强大的架构、丰富的文档或浏览现有基于 XML 标准的广阔领域时,都会得到回报。