XML(Extensible Markup Language,可扩展标记语言)是一种用自定义标签描述数据结构的文本格式,1998 年由 W3C 定为推荐标准。它不做显示,只做描述——这是它与 HTML 最根本的分界线。本节把一份真实文档放上解剖台,认识标签、元素、属性与文本内容。
某图书电商要与供应商系统对接,供应商发来的存货数据长这样:
<?xml version="1.0" encoding="UTF-8"?> <inventory> <!-- 供应商编号:S-1024,每日报送一次 --> <supplier id="S-1024">华东书源</supplier> <book sku="978-7-111-40701-0"> <title>算法导论</title> <stock>42</stock> <price currency="CNY">128.00</price> </book> <book sku="978-7-115-42802-8"> <title>JavaScript DOM编程艺术</title> <stock>7</stock> <price currency="CNY">59.00</price> </book> </inventory>
即便从没学过 XML,你也能一眼看出:这家供应商叫"华东书源",第一本书库存 42 本、定价 128 元。这就是 XML 的核心价值——自描述。数据自己带着结构说明书,人和程序都不需要额外的口译。
拿这份文档逐层解剖。最上面一行 <?xml ...?> 是 XML 声明,注明版本与编码。<inventory> 是根元素,整份文档只允许这一个根。<supplier id="S-1024">华东书源</supplier> 是一个完整元素:开始标签、内容、结束标签三段式;id="S-1024" 是属性,附着在开始标签上,像关节处的铭牌。<book> 内部嵌套 <title>、<stock>、<price>,层层嵌套构成树。
两者同源于 SGML,但分工不同。看一组对照:
<!-- HTML:告诉浏览器"怎么显示" --> <ul> <li><b>算法导论</b> —— 库存 42 本</li> <li><b>JavaScript DOM编程艺术</b> —— 库存 7 本</li> </ul> <!-- XML:描述"数据是什么" --> <book> <title>算法导论</title> <stock>42</stock> </book>
HTML 的标签集是固定的,<li> 表示列表项、<b> 表示加粗,浏览器照单渲染;XML 的标签随你定义,<stock> 是谁发明的?写这份文档的人。浏览器不认识它,也不需要认识——XML 文档的读者是程序,程序按约定取用。
⚠️ 常见误解:把 XML 当"更严格的 HTML"来学。两者用途几乎不重叠——HTML 造给人看,XML 造给系统看。前端页面里直接写 XML 的场景很少,配置文件、报文、数据交换才是它的主场。
JSON 确实抢走了大量接口场景,但 XML 在三块阵地依然稳固,原因都写在它的语言特性里:
| 特性 | 含义 | 典型受益场景 |
|---|---|---|
| 可扩展 | 标签自定义,无预定义集合 | 各行业自定方言:Spring 配置、SVG、SOAP |
| 平台无关 | 纯文本,任何系统可读写 | 跨企业、跨语言的数据交换 |
| 结构校验 | 有 DTD/XSD 契约可验 | 金融、医疗等对格式零容忍的报文 |
| 生态成熟 | 转换、查询、签名全套标准 | XSLT 出版流水线、XML 签名 |
第一,校验能力。JSON Schema 之前,JSON 没有广泛落地的校验标准;XML 从第一天就有 DTD,后来又有 XSD,"收到的报文必须长这样"可以写成机器可查的契约(第 3 章专门讲)。第二,文档能力。XML 天生适合表达"带层级的文档"——混合文本与结构,Office 的 docx、开放出版流程都是它。第三,历史存量。银行、保险、政务的对接规范三十年累积下来都是 XML,改造成本高过继续使用。
动手验证一下"平台无关"。把上面的 inventory 文档存成文件,用浏览器直接打开,浏览器会以可折叠的树形展示它;用记事本打开,它就是普通文本。同一份数据,零转换。
知道 XML 从哪来,能避免很多误会。上世纪八十年代,出版业用 SGML 管理海量书稿——能力极强、复杂度也极高,只有大出版社养得起。九十年代 Web 兴起,HTML 从 SGML 精简而来但标签定死;同时"数据在系统间搬运"的需求爆发,业界想要一种"SGML 的能力、HTML 的简洁"的格式。1996 年 W3C 成立工作组,1998 年发布 XML 1.0——目标是让普通开发者也用得起结构化标记。
这个出身解释了它的两个"性格"。其一,它天生面向文档:书稿是"正文里嵌结构"的混合形态,所以 XML 支持混合内容(第 2 章会详讲),这是后来 JSON 不具备的表达。其二,它强调国际文本:出版业多语种混排是常态,所以 XML 从第一版就认真对待编码与 Unicode,第 2 章的编码声明正是这份认真落下的零件。理解了"它替谁解决什么",再学语法就不再是背条文,而是看一件工具如何贴合它的用途。
动手小练习收尾:把本节开头的 inventory 文档改成你自己领域的数据——学生选课、服务器清单、菜谱都行,保留声明、根元素、至少两层嵌套、一个属性。写完用浏览器打开检查。这个小文档建议保存好,后面章节会反复对它开刀。
下一节把这份数据放回解剖台,沿着切面看清语法规则——哪些刀口是标准姿势,哪些一刀下去文档就报废。