可扩展标记语言(eXtensible Markup Language,XML)是一种强大的元标记语言,自1998年W3C发布1.0版本(后更新至1.1版)以来,已成为数据表示、存储和交换的标准。尽管在现代Web API中JSON逐渐占据主导,但XML在企业级系统、配置文件、文档格式和遗留系统中仍广泛应用。其核心优势在于严格的结构化、可验证性和可扩展性,支持复杂的数据模型和命名空间。
截至2025年12月,XML生态成熟,广泛用于SOAP服务、Android布局、Office Open XML(.docx/.xlsx)、SVG图形、RSS/Atom订阅等。XML的“可扩展”体现在用户可自定义标签和结构,而非像HTML那样预定义。
本篇文章将带你超越基础语法,深度解析 XML 的核心机制、高级特性及解析原理。
XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。设计目标是简单、灵活、可读性强。XML不是编程语言,而是描述数据的元语言——你可以自定义标签来表示结构化信息。
如果说 HTML 是互联网的“外表”,那么 XML(Extensible Markup Language) 就是互联网的“骨架”。尽管近年来 JSON 在 Web 开发中大行其道,但 XML 凭借其严谨性、自我描述性和强大的生态系统(如 XPath、XSLT),在企业级架构、配置文件、文档格式(如 Office)以及跨境支付(如 ISO 20022)中依然占据不可撼动的地位。
不同于HTML(超文本标记语言),HTML主要用于显示网页内容(固定标签如
、),而XML专注于数据本身,没有预定义标签,强调数据的结构和含义。这使得XML成为数据交换的“通用语言”,广泛用于配置文件、数据传输(如SOAP Web服务)、办公文档(Office Open XML)等。
简单来说,XML 是一种用于存储和传输数据的文本格式。它最大的特点是“自我描述性”——它不规定你需要使用哪些标签,你可以根据数据内容的需要,自己“发明”标签。
比喻: 如果说 HTML 是用来告诉浏览器“这行字要加粗,那个图要放左边”(侧重显示),那么 XML 就是用来告诉程序“这行字是用户名,那个数字是价格”(侧重内容)。
XML文档本质上是层次化的树结构(Tree Structure),从根元素开始,包含子元素、属性、文本、注释等节点。这与文档对象模型(Document Object Model,DOM)紧密相关,DOM是将XML解析为内存中树状对象的标准API。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
<bookstore>)。<Address> 和 <address> 是不同的标签。<b><i></b></i> 是错误的)。开头标签必须有对应结束标签(如),或使用自闭合标签(如:category="CHILDREN"。XML文档如果符合这些规则,称为格式良好的(Well-Formed)。如果还符合额外 schema(如DTD或XSD)定义的结构,则是有效的(Valid)。
深度思考:元素还是属性?
这是一个经典的建模问题。通常,数据本身放进元素,而数据的描述信息(如 ID、类型、语言)放进属性。
XML标准定义了五个内置实体引用(Entity References),用于转义最常见的特殊字符。这些是必须掌握的:
| 特殊字符 | 含义 | 转义实体 | 示例(原始) | 示例(转义后) |
|---|---|---|---|---|
| < | 标签开始 | < | 文本 |
<p>文本</p> |
| > | 标签结束 | > | if (a > b) | if (a > b) |
| & | 实体开始 | & | AT&T | AT&T |
| " | 属性值引号 | " | name="John" | name="John" |
| ' | 属性值单引号 | ' | name='John' | name='John' |
注意事项:
示例:
XML
<description>
如果 a < b 且 price > 100,则显示 "优惠 & 折扣"。
</description>
当内容包含大量特殊字符(如代码片段、脚本、HTML片段)时,一个个转义非常繁琐。这时可以使用 CDATA(Character Data)区段。
CDATA语法:
XML
<![CDATA[ 这里的内容原样输出,不解析任何标记或实体 ]]>
CDATA示例:
<script>
<![CDATA[
function check() {
if (x < 10 && y > 5) {
alert("x & y 满足条件");
}
}
]]>
</script>
CDATA限制:
在复杂的企业环境中,来自不同来源的 XML 可能会混合。如果“图书管理系统”有一个 <title>(标题),而“人事系统”也有一个 <title>(头衔),解析器就会混淆。
XML Namespaces 通过 URI(通常是 URL)作为前缀来解决这个问题:
XML
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.example.com/furniture">
<h:table> <h:tr><h:td>Apples</h:td></h:tr>
</h:table>
<f:table> <f:name>African Coffee Table</f:name>
</f:table>
</root>
默认命名空间(xmlns无前缀)简化书写。命名空间是XML互操作性的关键,如XHTML、SOAP、RDF等标准。
XML 不仅仅是“长得对”(良构,Well-formed),更重要的是“内容对”(有效,Valid)。
程序如何读取 XML?主要有两种截然不同的哲学:DOM 和 SAX。DOM是将XML解析为内存中树状对象的标准API。DOM节点类型包括:元素节点、属性节点、文本节点、注释节点、处理指令(PI)等。解析器(如Java的DOMParser、Python的xml.etree.ElementTree)将XML加载为DOM树,支持遍历、修改和序列化。
高级特性:
| 特性 | DOM (Document Object Model) | SAX (Simple API for XML) |
|---|---|---|
| 工作原理 | 将整个文档加载进内存,构建完整的树。 | 流式读取,每遇到一个标签就触发一个事件。 |
| 优点 | 随机访问极快,可以随意修改节点。 | 内存消耗极低,适合处理 GB 级的超大文件。 |
| 缺点 | 非常消耗内存,大文件易崩溃。 | 只能向前读取,无法回溯,编写逻辑较复杂。 |
| 比喻 | 把整本书买回家,翻到哪页看哪页。 | 坐在电影院看电影,看一幕过一幕,回不了头。 |
XML 真正强大的地方在于它不仅仅是一种格式,而是一套工具链:
尽管现在 JSON 非常流行,但 XML 在以下领域依然是“老大哥”:
.docx 或 .xlsx 文件,本质上是一堆 XML 文件的压缩包。如何查看和编辑XML?
| 维度 | XML | JSON |
|---|---|---|
| 可读性 | 较重,存在冗余标签。 | 轻量,简洁,更贴近编程语言的数据结构。 |
| 元数据支持 | 强(支持属性和注释)。 | 弱(仅支持键值对)。 |
| 验证 | 极强(XSD/DTD)。 | 较弱(JSON Schema 较晚普及)。 |
| 浏览器支持 | 原生支持。 | 完美支持(JavaScript 天生兼容)。 |
在很多场景中,比如旧项目改造,我们需要把JSON格式数据转化成XML格式,或者把XML格式数据转化成JSON格式,可以使用 在线 XML和JSON互转工具 实现一键转换。
XML 就像是一套标准化的“数字集装箱”,它不关心箱子里装的是什么,但它确保了无论这台机器使用的是什么语言,都能通过这套标签结构准确地读懂里面的数据。
XML 是为严谨性和通用性而生的。尽管在移动端和简单的 Web API 中 JSON 更受欢迎,但在涉及多维数据结构、长期存档、以及跨平台强制验证的场景下,XML 依然是不可替代的工业级方案。