📄 一句话概括
XML 的标签没有词表——想叫什么就叫什么,这种由使用者无限扩充词汇的能力,就是【可扩展】三个字的本义。
📝 本节和前面几节的关系
上一节学会了 XML 的写法与规矩,本节回答一个更根本的问题:为什么叫【可扩展】的标记语言?
一、词汇表是谁定的
HTML 的标签是一份封闭词表:只有标准里有的才能用,想表达【实验器材】也没有对应的标签;
XML 干脆不给词表——<学生>、<配方>、<实验器材> 想怎么叫就怎么叫;
新增一门行业,就新增一批标签——不必等标准组织开一次会,这就是可扩展。
二、可扩展带来的自由与代价
自由:任何领域都能用 XML 描述自己的数据,不用改造语法本身;
代价:人人自创标签,别人看不懂 <p> 到底是价格还是页码——语义没有统一保证;
两种补救办法:11.4 用标签名赋予意义(起个好名字),11.7 用结构定义(DTD/Schema)把规矩写死。
三、一套语法,千种行业
XML 只规定了怎么造标签,不规定造什么标签——语法一层通用,词汇一层百花齐放; 正因为这种分工,同一个解析器能读新闻订阅、矢量图形、办公文档——下一节【元语言】把这层意思说透。
四、动手 Demo:自创标签,解析器照收
现编两组谁都没想到的标签,让解析器当场读读看——证明词汇表在语法之外。
import xml.etree.ElementTree as ET
doc1 = "<学生><姓名>张三</姓名><班级>三班</班级></学生>"
doc2 = "<配方><原料>面粉</原料><用量 unit=\"克\">200</用量></配方>"
for doc in (doc1, doc2):
r = ET.fromstring(doc)
print("根:", r.tag, "| 子元素:", len(list(r)))
实跑输出:
--------------------------------------------------------------------
XML 是可扩展的语言
--------------------------------------------------------------------
HTML 的标签是【预定的】: 只能用 h1/p/a 这些别人定好的。
XML 的标签【自己想】——想叫什么就叫什么, 这正是【可扩展】的含义:
<学生><姓名>张三</姓名><班级>三班</班级></学生>
<配方><原料>面粉</原料><用量 unit="克">200</用量></配方>
上面自创了 6 个标签: 学生, 姓名, 班级, 配方, 原料, 用量
解析器不嫌它们陌生——只要成对闭合就照单全收:
解析自创标签: 根=学生 / 子元素 2 个 / 第一个=姓名
但灵活也有代价: 人人自创标签, 别人怎么知道 <price> 是价格而不是票价?
靠 11.4 的【赋予意义】和 11.7 的【结构定义】约束——先记住: XML 不自带词汇表。
解析器只认语法不认词汇:只要标签成对、根唯一,名字再陌生也照单全收。 这也解释了为什么需要命名空间(11.6):两拨人各自发明 <名称>,撞名是迟早的事。
30 秒实验
- 为你的专业(如亮化工程)自拟 5 个 XML 标签名,并说明各自表达什么信息。
- 讨论:如果所有行业都自创标签,跨行业交换数据会遇到什么麻烦?
常见误区
- 以为【可扩展】是指可以给 XML 语法加新功能——它指的是标签词汇可自由扩充,语法本身不变。
- 以为自创标签就等于随意写——语法规矩(成对、根唯一)一条都不能少。
自测三问(点开对答案)
1. 可扩展指的是什么? —— 标签词汇由使用者自定义,不受固定词表限制。 2. 自由带来的代价是什么? —— 标签含义无统一保证——需靠命名与结构定义补救。 3. XML 语法与词汇的分工? —— 只规定怎么造标签,不规定造什么标签。- ☐ 下一节(11.3 XML 是元语言)
相关笔记
- XML 是标记语言 — 写法与规矩在这里
- 🕸️ Web技术原理 · 索引 — HTML 封闭词表的对照面
- 💻 计算机是怎样跑起来的 · 索引