XML,可扩展标记语言

作者:Andrew Kuchling

标准通用标记语言已经有大约二十年的历史了。SGML 最初是为处理大型文档集而设计的,但 SGML 既不是编程语言,也不是文本格式化语言。相反,它是一种语言,允许定义自定义标记语言。今天最著名的基于 SGML 的语言无疑是 HTML。

由于 SGML 已经存在了二十年,许多公司都提供 SGML 工具和产品,并且它在许多高端文档处理应用中根深蒂固。SGML 是一种相当庞大的语言;但是,理解其基础知识并不十分困难。它确实包含许多很少使用的功能,这些功能更难理解。实现一个完整的 SGML 解析器是困难的,这使得 SGML 有了可怕复杂性的声誉。这种声誉并非完全名副其实,但它足以吓退许多人不去使用它。

因此,XML 是 SGML 的精简版本,它牺牲了一些功能以换取更容易理解和实现。它仍然是一种元语言,但 SGML 的许多较少使用的功能和选项已被删除。《XML 1.0 规范》大约有 40 页长,并且可以在几周的努力内实现一个解析器。

简要一览

使用 XML 指定的标记语言看起来很像 HTML

<?xml version="1.0"?>
<!DOCTYPE myth SYSTEM "myth.dtd">
<myth>
 <name lang="latin">Hercules</name>
 <name lang="greek">Herakles</name>
 <description>Son of Zeus and Alcmena.</description>
 <mortal/>
</myth>

XML 文档由一个包含子元素的单个元素组成,子元素内部可以有更深层次的子元素。元素由文本中的标签指示,标签由尖括号 <...> 内的文本组成。有两种形式的元素可用。元素可能包含开始标签和结束标签之间的内容,例如 <name>Hercules</name>,这是一个包含数据 Hercules 的 name 元素。此内容可以是文本数据、其他 XML 元素或两者的混合。元素也可以是空的,在这种情况下,它们表示为以斜杠结尾的单个标签,例如 <mortal/>,这是一个空的 stop 元素。这与 HTML 不同,在 HTML 中,空元素(如 <BR><IMG>)与非空元素(如 <H1>)的指示方式没有区别。同样与 HTML 不同的是,XML 元素名称区分大小写;mortalMortal 是两种不同的元素类型。

开始标签和空标签也可以包含属性,这些属性指定与元素关联的值。例如,文本如 <name lang="greek">Herakles</name>name 元素具有一个值为 “greek” 的 lang 属性。在 <name lang="latin">Hercules</name> 中,属性的值为 “latin”。与 HTML 的另一个不同之处在于,属性值周围的引号不是可选的。

给定 XML 应用程序的规则由文档类型定义 (DTD) 指定。DTD 仔细列出了允许的元素名称以及元素如何在彼此内部嵌套。DTD 还指定了可以为每个元素定义的属性、它们的默认值以及它们是否可以省略。例如,为了与 HTML 进行比较,代表列表中条目的 LI 元素只能出现在代表列表的某些元素(例如 OLUL)内部。

文档类型定义在 DOCTYPE 声明中指定;上面的文档使用了一个名为 “mythology” 的 DTD,这是我为本文发明的。“mythology” DTD 可能包含以下声明

<!ELEMENT myth (name+, description, mortal?)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name lang ( latin | greek ) "latin">
<!ELEMENT description (#PCDATA)>
<!ELEMENT mortal EMPTY>

我不会详细介绍这些行的每个细节,但是,以 <!ELEMENT 开头的行是元素声明。它们声明元素的名称以及它可以包含的内容。因此,myth 元素必须包含一个或多个 name 元素,后跟一个 description 元素,然后是一个可选的 mortal 元素。(+、* 和 ? 的含义与正则表达式中的含义相同:一个或多个、零个或多个以及零个或一个出现。)另一方面,mortal 标签必须始终为空。

第三行声明 name 元素具有一个名为 lang 的属性;此属性可以具有 “latin” 或 “greek” 这两个值中的任何一个,如果未指定,则默认为 “latin”。

验证解析器可以被赋予 DTD 和文档,以验证给定文档是否有效,即,它是否遵循 DTD 的所有规则。这与 HTML 非常不同,因为 web 浏览器在历史上一直具有非常宽松的解析器,因此相对较少的人努力编写有效的 HTML。这种宽松性意味着用于渲染 HTML 文本的代码充满了黑客手段和特殊情况;希望 XML 不会陷入同样的纵容陷阱。

本文没有涵盖 XML 的所有功能——我没有讨论所有可能的属性类型,实体是什么,或者 XML 使用 Unicode,这使 XML 处理器能够处理以几乎任何字母表编写的数据。有关 XML 语法的完整详细信息,唯一的权威来源是 XML 1.0 规范,可在万维网联盟的 XML 页面上找到(请参阅“资源”部分)。然而,像所有规范一样,它非常正式,并非旨在作为友好的介绍或教程。更温和的介绍开始出现在网络和书店的书架上。

为什么 XML 很重要?

XML 很可能在未来几年变得非常普遍。许多新的与 web 相关的数据格式正在作为 XML DTD 草拟;三个例子是用于指定数学方程式的 MathML、用于分类和描述信息资源的 RDF(资源描述框架)以及用于同步多媒体的 SMIL。还有个人在努力为各种应用定义 DTD,包括家谱数据、电子数据交换和矢量图形;列表一直在增长。

XML 主要不是 HTML 的竞争对手。万维网联盟计划将下一代 HTML 基于 XML,但目前形式的 HTML 不会很快消失。许多人已经学习了 HTML 并愉快地使用它;他们并不特别想要或需要创建新标记的能力。现在网络上有数百万个现有的 HTML 文档,将它们转换为 XML 将需要很长时间;许多文档可能永远不会被转换。

XML 非常重要,并且 XML 支持将非常普遍。Mozilla 和 Internet Explorer 浏览器的下一个版本都将支持 XML,并将以各种方式在内部使用它。越来越多的新数据格式被编写为 XML DTD。推动这一论点的理由很简单:如果每个平台上都可用 XML,并且如果其功能适合任务,那么使用 XML 将节省时间,而且几乎不需要付出努力,这始终是一个有说服力的论点。

此外,程序员将可以轻松访问 XML。James Clark 的 Expat 解析器(请参阅“资源”部分)是高质量代码,并且根据 Mozilla 公共许可证的条款免费提供。我不会惊讶地看到未来的 Linux 发行版将 Expat 作为基本系统的一部分提供。用于 Python、Perl 和 Tcl 等脚本语言的 Expat 接口已经在开发中,并且可能在您阅读本文时已经完成。很快,向程序添加 XML 解析将像向您的代码添加 from xml import parsersuse XML::Parser 一样容易。

Andrew Kuchling 在华盛顿特区的 Magnet Interactive 担任网站开发人员。他过去的项目之一是一个相当大的商业网站,该网站是使用 Python 在 Illustra 数据库之上实现的。可以通过电子邮件 akuchling@acm.org 与他联系。

加载 Disqus 评论