💻 第十一章 XML究竟是什么
📄 一句话概括

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 秒实验

  1. 为你的专业(如亮化工程)自拟 5 个 XML 标签名,并说明各自表达什么信息。
  2. 讨论:如果所有行业都自创标签,跨行业交换数据会遇到什么麻烦?

常见误区

  1. 以为【可扩展】是指可以给 XML 语法加新功能——它指的是标签词汇可自由扩充,语法本身不变。
  2. 以为自创标签就等于随意写——语法规矩(成对、根唯一)一条都不能少。
自测三问(点开对答案) 1. 可扩展指的是什么? —— 标签词汇由使用者自定义,不受固定词表限制。 2. 自由带来的代价是什么? —— 标签含义无统一保证——需靠命名与结构定义补救。 3. XML 语法与词汇的分工? —— 只规定怎么造标签,不规定造什么标签。

相关笔记