XML,正如万维网联盟在1998年定义的那样,是一种标记文档或字符流的方法,用于识别数据中的结构单元或其他单元。XML 为解决半结构化数据问题做出了多项贡献,数据库理论家使用该术语来表示具有以下任何特征的数据:
XML 为分层结构和重复字段或结构提供了自然的表示形式。此外,XML 文档类型定义 (DTD) 和模式允许对数据中允许的变体量进行细粒度控制:词汇表设计者可以要求 XML 数据完全规则,或者他们可以允许少量变体,或者大量变体。在极端情况下,XML 词汇表可以有效地表示除了所有格式良好的 XML 所需的规则之外,没有任何规则。由于 XML 语法仅记录存在的内容,而不是可能存在的所有内容,因此稀疏数据不会使 XML 表示显得笨拙;XML 存储系统通常构建为优雅地处理稀疏数据。
然而,XML 对半结构化数据问题最重要的贡献是质疑问题的性质和存在。正如描述清楚表明的那样,半结构化数据只是不完全符合关系模型的数据。提到“半结构化数据问题”在潜意识里暗示问题在于数据未能完全符合关系模型,而不是模型及其未能完全支持数据的自然结构。
在野外(即在日常生活中遇到的文档、报告和程序数据结构中),信息的形式与第三范式截然不同。XML 源于以设备和应用程序无关的方式表示文档的努力,它反映了文档的复杂性以及它们顽固地拒绝适应表格形式。
在 XML 中,数据可以具有精细而复杂的结构,这种结构比行和列表格要丰富和复杂得多。将此称为半结构化具有误导性,就像将 DNA 分子描述为半结构化一样,因为它们不如食盐的分子那样简单规则。XML 旨在尽可能捕获和表达我们理解的数据结构,而无需将其强行放入过于简单的结构中。
定义什么算作有效文档需要比关系系统提供的更丰富的定义语言。在典型的技术手册中,列表和段落可能出现在同一级别,但一些文档部门要求在任意两个列表之间必须至少出现两个段落。这很容易使用正则表达式或形式语言理论中的类似工具来定义;使用诸如 SQL 模式之类的机制来定义并不简单。
当然,与任何元语言一样,XML 对其应用程序的语义有影响。XML 首先邀请我们将信息视为具有结构。这使其与数据库系统区分开来,数据库系统始终强调信息的细粒度结构,而不是与现代文档处理区分开来,现代文档处理经常无法有意义地利用文档结构。良好的 XML 设计非常强调信息结构,以至于当描述性标记的支持者听到数据库理论家将文档描述为半结构化时,他们会感到惊讶和好笑。
更具体地说,XML 邀请我们使用形成树结构的元素、修饰树节点的属性以及允许我们对任意图(而不仅仅是树)建模的节点间链接来建模信息结构。对于这种树结构,XML 以标记括号的形式提供了直接的线性表示,可用于信息的串行传输。从根本上说,XML 只是一个标记括号,其中每个元素都在其开头用开始标记标记,并在其结尾用结束标记标记。
DTD 提供的文档语法允许一种表达树形约束的自然方法。XML 文档的元素实例化的树结构可以很容易地解释为符合文档语法的文档的抽象语法树。
数据结构、串行形式和文档语法以竞争性文档表示方法所缺乏的方式相互补充和加强。SGML(标准通用标记语言)和 XML 这三个方面之间的相互作用有助于解释为什么许多从业人员觉得它们如此正确。关系数据库系统的用户受益于基本表格数据模型和关系模式中可表达的约束机制的类似相互加强。然而,作为一个群体,他们并没有像 SGML 和 XML 用户所表现出的那样,对逗号分隔值转储产生同样强烈的喜爱和依恋。也许是因为表格数据具有如此简单的结构,以至于对其进行序列化似乎并不是一个难题;序列化树并不难,但它也足够困难,足以让一位疲惫不堪的程序员感谢现成的解决方案。
不过,有一件事可能会让一些观察者觉得 XML 缺少:XML 规范没有定义 XML 标记的语义。这并非偶然。支持文档重用的愿望促使 XML 设计者避免提供任何格式化原语集。相反,良好的 XML 设计强调声明性含义和标记文档的逻辑结构,而不是其在特定样式中的外观。支持任何类型的文档的愿望,加上对文档在实践中如何变化的深刻理解,进一步导致:XML 不仅避免定义与格式相关的原语,而且避免定义任何语义原语。XML 应用程序的基本语义不是由 XML 规范提供的,而是由词汇表的设计者提供的。设计者可以完全自由地识别任何所需粒度级别的可标记信息单元,并为它们提供任何所需的语义。
由于 SGML 和 XML 没有提供可以解释文档的语义原语,因此它们经常被描述为“仅仅是语法”。人们可能会怀疑,纯粹的语法表示法是否构成了真正的进步。定义标记括号、树结构和文档语法的形式主义真的足以使 XML 变得有趣或重要吗?当然,在某些方面,答案是否定的;这些都不是特别复杂的问题。哪位计算机科学的研究生会认为开发用于序列化树的表示法的问题需要超过一个周末的工作?任何有能力的程序员都可以编写程序来解析任何合理清晰的表示法。约束检查有点困难,但是如果在图灵完备的编程语言中检查约束,我们可能更有机会实际表达我们想要表达的所有约束。
然而,在许多其他方面,答案是肯定的;纯粹的语法表示法是一个巨大的进步。XML 对于希望利用其数据的人们来说很有趣,因为它在文档之间提供了足够的通用性,从而可以构建通用工具,而不是专门针对单一表示法的工具。对于那些想花时间处理数据,而不是构建新工具的人来说,这种通用工具是一个巨大的进步。通用语法导向编辑器,仅由模式或 DTD 等简单工具引导,使创建良好数据变得更容易。用于数据验证的通用工具使检查许多错误成为可能,并允许程序员将更多时间用于处理数据,而将更少时间用于检查输入是否干净。通用浏览器和显示引擎,在良好的样式表语言的支持下,使得以针对不同用户或流程定制的多种样式显示数据成为可能。
如今,几乎每个现代 Web 浏览器都可以使用 CSS(层叠样式表)显示原生 XML,最好的浏览器还支持 XSLT(可扩展样式表语言转换)。用于数据操作的通用工具提供了对正在处理的信息结构的高级访问。精心设计的 XML 词汇表将特定于域的结构映射到元素和属性,由此推论,特定于域的流程可以很容易地用对元素和属性的操作来描述。一个支持 XML 的工具实际上可以成为一种更高级的编程语言。
由于 XML 文档的核心语义不依赖于特定的应用程序软件,而是依赖于声明性语义(这些语义是或应该是明确记录的),因此 XML 的使用确实有助于确保数据的寿命和可重用性。有时,只需要一个相当薄的、面向语法的、语义空洞的通用层就可以极大地简化事情。
如前所述,XML 邀请我们将信息建模为树,但它不需要以这种形式处理。XML 可以在以下几个不同的抽象级别上理解和处理:
级别的多样性有时会使新用户感到困惑,并可能冒犯那些只看到模型的定义具有优点的那些人,模型的访问权限仅限于通过良好控制的应用程序编程接口提供的单个抽象层。然而,描述性标记的用户一直不愿将自己限制在单个抽象级别。拥有理解上面列表中更高级别抽象的工具很方便,但能够使用仅将数据理解为字符流的机制可靠地复制或转码 XML 文档也很方便。不同的抽象级别适用于不同的流程和应用程序:复制程序可以对 XML-as-character-stream 感到满意,但典型的应用程序程序通常希望从字符流的细节中抽象出来(例如,静默地省略不重要的空格)。大多数支持 XML 的软件更喜欢在元素级别工作,但 XML 编辑器通常是一个例外,因为如果 XML 编辑器重新格式化标记,则在 ASCII 编辑器中仔细美化打印 XML 注释或标记的用户通常会感到愤怒。
如果不同的应用程序想要或需要不同的抽象级别,那么描述性标记的支持者(他们为应用程序独立性而奋斗)会发现允许在如此多不同的级别查看 XML 是一种优势,而不是劣势,这当然是可以理解的。
XML 堆栈中的不同层提供对这些不同抽象层的访问。XML 数据流由文件系统或网络接口提供,就像任何其他表示法一样。XML 的流内部字符编码声明提供了将实际传入的八位字节流转换为字符流所需的信息。XML 处理器读取八位字节流,将其转换为字符,并将其解析为标记和内容,通过 SAX(XML 简单 API)或 DOM(文档对象模型)等接口为下游消费者提供访问。如果生成的输出太高级(因为应用程序确实需要关注输入中标记内的空格之类的内容),则可以使用正则表达式以直接的方式区分输入中的标记和内容。1
然而,大多数 XML 数据的消费者将通过 SAX 或 DOM 过滤器读取它,或者通过由数据绑定工具从模式生成的编组和解编组代码读取它。一旦数据以编程语言的原生数据结构表示,处理就可以正常进行。
然而,在越来越多的情况下,数据处理后,结果需要以 XML 形式写出。一旦数据所有者得出结论,XML 提供了一种确保信息可重用性和寿命的好方法,那么很快就会得出结论,我们关心的所有信息都应该以 XML 表示,包括我们程序的输出。一致地应用这种思路会导致信息处理架构,其中几乎每个流程都变成从一种 XML 形式到另一种 XML 形式的转换。
此时,XML 和传统编程语言之间的阻抗失配可能会变得令人痛苦。将 XML 视为本机数据格式并因此消除阻抗失配的语言可以提供极大的便利。在这类语言中,迄今为止最突出的两种语言是 XSLT,XSL(可扩展样式表语言)的转换部分;以及 XQuery,一种尚未最终标准化的新语言,尽管越来越多的主要数据库供应商的商业产品支持它。
一些敏锐的观察家认为,XML 最吸引人的方面之一是它能够表示历史上在数据库管理系统中管理的数据类型,以及历史上逃避数据库系统的主要文本数据类型,这主要是因为其结构过于多变,无法在数据库中表示。通过为所有数据提供通用表示法,XML 为结束表格数据与其他类型数据的隔离带来了希望。
这些愿望提高了 XML 的赌注,XML 不仅必须在其设计者想到的环境和信息类型中工作,还必须在其他完全不同的环境和非常不同类型的数据中工作。结果是来自非常不同地方的数据和人类思想的对抗。以下可能值得概述一些具体的对抗和混乱的来源。
语法及其不满。也许在所有与 XML 相关的主题中,没有哪个主题的观点像文档语法或模式的适当角色那样存在如此广泛的分歧。在 SGML 中,文档类型定义是文档的必需部分:如果数据流没有 DTD,则它不是 SGML。由于 SGML 允许在某些条件下省略开始标记和结束标记,因此 DTD 在任何情况下对于使解析器能够识别元素边界都是必不可少的。然而,经验表明,某些通用应用程序(例如,全文索引或文档格式化或显示)很少或根本不使用 DTD。一些非 SGML 标记语言表明,对 SGML 的引用具体语法进行微小的语法更改可以使在没有 DTD 的情况下可靠地识别元素边界成为可能。
因此,XML 的设计者使 DTD 成为可选的。
现在,许多词汇表在开发、记录和部署时都没有任何正式的文档语法。有些人认为这是 XML 的一个关键优势,因为它允许开发人员绕过关系世界中应用程序开发成本最高且最困难的阶段之一:模式的开发。通常,模式开发之所以困难,更多是出于政治或社会原因,而不是技术原因,并且最终围绕特定模式形成的共识可能会因任何重大的颠覆性变化而受到干扰——包括正在设计的系统的部署以及随之而来的以前难以获得的信息的随时可用性。从这个角度来看,在没有模式的情况下开始开发——尽管这看起来像是开始一段没有地图的旅程——作为快速部署和修订的迭代过程的开始,可能是有道理的。
然而,一些观察家对在没有让所有相关人员坐下来在一个房间里同意模式的纪律的情况下开发和部署 XML 应用程序的可能性感到震惊。(该群体包括一些最著名的数据库从业人员和研究人员。这些研究人员抱怨说,XML 允许部署系统,例如,跨国公司不同国家的人力资源部门缺乏对全职员工概念的任何共同定义。当指出这种情况也可能发生在关系系统中时,回应是:“但是 XML 使其变得容易。”)
许多基于 XML 的复杂系统的开发人员,尽管对 DTD 是可选的并不感到震惊,但认为它纯粹是学术性的。即使软件在缺少 DTD 的情况下不必发出错误消息而失败,但事实仍然存在(这些开发人员坚持认为),文档语法对于开发连贯的复杂应用程序绝对是必不可少的。它们约束数据,因此处理数据的软件可以专注于正确处理有效数据,并且可以减少检测基本语法错误的工作量;应用程序对防御性编程的需求较少。文档语法充当数据源和数据使用者之间的合同(在某些情况下,实际上是这样)——前者承诺提供符合语法的数据,后者承诺处理任何符合语法的数据。在汽油泵和收银机的供应商之间就谁应对消息丢失负责的纠纷中,可以针对文档语法验证所讨论的消息,以裁决问题:如果消息无效,则发送者必须修复其消息生成代码;如果消息有效,则接收者必须完成工作。
由于文档语法定义的文档集比所有格式良好的 XML 文档的集合更小且更具共性,因此文档语法在推理数据和数据集合方面很有用。与关系系统一样,模式在允许数据库软件推理查询的可能优化方面起着关键作用。
同样,文档语法(与其他语法一样)可以用于记录数据模型或解释特定概念。一些系统设计人员将为多阶段管道中 XML 的所有中间形式指定文档语法,即使他们不希望在该点验证数据。该语法记录了处理的一个阶段的预期输出以及处理的下一个阶段的预期输入。
在 XML 模式中,文档语法还将类型与文档中的每个元素和属性关联;针对语法进行验证的结果是带有附加到(有效)节点的类型注释的注释 XML 树。
在某些情况下,文档语法仅用于为复杂结构提供有用的名称,以简化对其的操作。Gaston H. Gonnet 和 Franklin William Tompa 在 1987 年提供了早期关于语法在这种用途中的使用的描述。2
在讨论文档语法的效用或徒劳时,人们并不总是意识到的是,它们在留给数据的自由度方面可能差异很大。对于充分理解或严格约束的数据,可以编写非常严格的语法。每个部分都必须有一个标题和一个副标题。在任意两个列表之间,必须至少有两个段落。任何部分都不得少于五个段落,并且任何超过 20 个段落的部分都必须划分为小节。在具有 20 个从属部件的结构中,这些部件必须按特定顺序出现。
对于不太容易理解的数据或要求不太严格的数据,可以定义较宽松的规则。在极端情况下,可以编写一种形式语法,它可以接受绝对任何格式良好的 XML 文档。这种语法对于验证输入并没有太大好处,但它仍然可以用来明确记录重要事实,即在数据流中的特定点,除了数据是格式良好的 XML 的要求之外,没有任何约束。(这通常被称为滑铁卢语法,以纪念安大略省滑铁卢大学的新牛津英语词典项目,该项目使用类似于 SGML 的标记系统,但没有制定文档语法。隐含的规则是任何东西都可以放在任何地方;滑铁卢语法是一种明确指定该规则的语法。请注意,词典项目实际上并没有使用滑铁卢语法;尽管对语法归纳进行了有用的研究,但在项目中开发的生产软件根本没有使用任何语法。)
XML 和面向对象模型。 XML 文档的分层结构与对象的分层结构具有明显的相似之处。对象技术在 XML 中的应用以及 XML 在对象技术中的应用长期以来一直是人们感兴趣的话题。面向对象设计和 XML 之间存在明显的相似之处,但一些差异使跨越此边界的人们的生活变得复杂
XML 和关系模型。 乍一看,XML 和关系模型似乎完全不相容。XML 数据很少能优雅地简化为表格表示:元素具有可变数量的子项,XML 数据通常甚至不符合任何类似于第一范式的形式,并且顺序至关重要。(仅仅从戏剧的数据库表示中获取《哈姆雷特》的所有单词是不够的;它们必须按正确的顺序排列。)
然而,XML 和关系模型的许多目标是相似的:应用程序独立性、声明性而非命令式语义、数据验证的规定、可以用于表示特定于域的概念和信息的通用基本数据模型的定义,以及从模型到真实世界语义的映射牢牢地掌握在用户手中。由于如此多的基本目标是相似的,因此似乎尽管在关系系统中支持 XML 涉及许多棘手的技术问题,但哲学问题比预期的要少。
XML 是一个非常年轻的规范,尚未满 10 岁。其令人惊讶的普及为在系统实践开发和更理论层面上的进一步工作提供了许多机会。以下是一些尚未解决的问题。
XML 需要更好的工具支持:更简单的将流程粘合在一起的机制和更简单的 XML 管道构建。
与此类似,我们需要更好的方法来处理多阶段处理,以及更好的方法来描述数据传递的相关的模式序列。
传统编程语言的用户迫切需要更好的数据绑定工具,用于编组和解编组 XML。在这里,一些问题可能归咎于当今的工具,这些工具有时对重要的构造提供不太好的支持。但一些问题与编程语言数据结构和 XML 之间的不匹配有关。
一些观察家认为,正确的答案不是改善 XML 和传统编程语言之间的阻抗失配,而是彻底消除它。如果 XML 成为本机数据类型,我们可以完全避免编组和解编组。SQL 系统正在坚定地朝着这个方向发展,一些编程语言可能会效仿。一些已经本机支持 XML 的系统(例如 XSLT 和 XQuery)可能会悄然获得更多完整编程语言的装备。
通过提供树结构,而不是仅仅是字符行或表格结构,XML 极大地丰富了文档和其他信息的表示可能性。许多类型的信息(包括文档)都具有突出的分层组织,并且使用 XML 表示它们比使用竞争性表示法要自然和方便得多。但残酷的事实是,在许多有趣的类型的数据中,分层结构与其他竞争性分层结构共存,或者与抵抗任何类型层次结构的信息共存。
举一个简单的例子:一本书通常具有前言、正文和后记的分层逻辑结构,正文又细分为章、节、小节等等;但书籍也具有卷、合订本、开本、页、列、行的物理结构。每当段落跨越页面边界流动时——也就是说,几乎总是如此——这两个层次结构就会发生冲突。这个主题至少 20 年来一直引起标记理论家的兴趣,并且新的提案不断涌现:并发标记层次结构、彩色 XML、GODDAG(通用有序后代有向无环图)结构、即时树、LMNL(分层标记注释语言)和范围代数只是最近一些更有趣的提案。
XML 从 Noam Chomsky 在 1957 年定义的形式语言理论中继承了语言是字符串的布尔集合的概念。3 应用于文档和文档语法,这意味着文档要么有效且是集合的成员,要么无效且不是成员。实际上,有些错误比其他错误更严重,如果我们的有效性概念允许连续(“模糊”)值而不是强制黑/白区分,我们的系统会更少僵化和脆弱。区分的僵化是一些 XML 用户宁愿不使用文档语法的原因之一。更灵活的有效性概念将使编写灵活的应用程序成为可能,而无需屈服于脏数据。
鉴于无模式 XML 词汇表的massive proliferation(大规模扩散/激增),对支持语法归纳工具的需求正在增加:给定一组 XML 数据,可以编写哪些语法来描述这些数据? 在这个领域已经有一些或多或少广为人知的努力,从 1980 年代后期为《新牛津英语词典》生成语法的尝试,到 OCLC(在线计算机图书馆中心)Fred 项目的面向工业的语法归纳。
无论是否无模式,XML 词汇表的数量都在爆炸式增长,而且在短期内不太可能减少。无论是在数据集成项目的背景下(这些项目旨在提供对数据源联邦的搜索),还是在处理不断演变的文档语法的单个项目的背景下,XML 的数据交换问题应用都非常重要。给定两个模式 S1 和 S2,允许方便地指定从 S1 到 S2 的映射,或者自动找到这样的映射。给定该映射以及针对模式 S2 的查询,将查询转换为模式 S1 的术语,以便在数据被物化到模式 S2 之前进行过滤。
XML 如何帮助解决半结构化数据问题? XML 提供了一种工具,用于表示和处理数据,并认识到其内置结构的复杂性。
C. M. SPERBERG-MCQUEEN 是万维网联盟(World Wide Web Consortium)的技术人员,该联盟是一个负责制定 Web 标准的国际会员组织。他共同编辑了 XML 1.0 规范和文本编码倡议指南。他拥有斯坦福大学比较文学博士学位,但在读研究生时误入计算机领域,从此再也没有出来。他的 Erdös 数是 6。
最初发表于 Queue 杂志第 3 卷第 8 期—
在 数字图书馆 中评论这篇文章
Andrew McCallum - 信息抽取
2001 年,美国劳工部受命建立一个网站,以帮助人们在全国各地的社区学院、大学和组织中找到继续教育机会。该部门希望其网站支持对地点、日期、时间、先决条件、讲师、主题领域和课程描述进行字段化的布尔搜索。最终,它还对挖掘其新数据库以获取模式和教育趋势感兴趣。这是一个重大的数据集成项目,旨在每三个月从数万个独立机构自动收集详细的结构化信息。
Alon Halevy - 为什么你的数据无法混合
当独立的各方为同一领域开发数据库模式时,它们几乎总是彼此完全不同。这些差异被称为语义异构性,语义异构性也出现在多个 XML 文档、Web 服务和本体的存在中——或者更广泛地说,只要存在不止一种结构化数据体的方式时就会出现。半结构化数据的存在加剧了语义异构性,因为半结构化模式从一开始就更加灵活。为了使多个数据系统相互协作,它们必须理解彼此的模式。
Natalya Noy - 从混乱中理出秩序
过去十年在可供人类和机器处理的在线信息量方面带来了“大爆炸”,这可能是没有什么争议的。它促成的趋势(还有许多其他趋势)中有两个是:首先,已经转向比以前存储大部分电子数据的传统集中式关系数据库更灵活和流动的(半结构化)模型;其次,今天可供处理的信息实在太多了,我们需要机器的帮助。
Adam Bosworth - 从 Web 中学习
在过去的十年中,我们看到了计算领域的一场革命,这场革命在范围和影响力方面超越了迄今为止所见的任何事物,而且也超越了我们对构成“好”与“坏”计算的思考方式。