XML是Extensible Markup Language的缩写,即可扩展标记语言是一种您可以用来创建自己的标记的标记语言。它由万维网协会(W3C)创建,用来克服 HTML(即超文本标记语言(Hypertext Markup Language),它是所有网页的基础)的局限。和 HTML 一样,XML 基于 SGML ― 标准通用标记语言(Standard Generalized Markup Language)。尽管 SGML 已在出版业使用了数十年,但其理解方面的复杂性使许多本打算使用它的人望而却步(SGML 也代表“听起来很棒,但或许以后会用(Sounds great, maybe later)”)。XML 是为 Web 设计的。
XML实际上是Web上表示结构化信息的一种标准文本格式,它没有复杂的语法和包罗万象的数据定义。XML同HTML一样,都来自SGML(标准通用标记语言)。SGML是一种在Web发明之前就早已存在的用标记来描述文档资料的通用语言。但SGML十分庞大且难于学习和使用。鉴于此,人们提出了HTML语言。但近年来,随着Web应用的不断深入,HTML在需求广泛的应用中已显得捉襟见肘,有人建议直接使用SGML作为Web语言。但SGML太庞大了,学用两难尚且不说,就是全面实现SGML的浏览器也非常困难。于是Web标准化组织W3C建议使用一种精简的SGML版本——XML。XML与SGML一样,是一个用来定义其他语言的元语言。与SGML相比,XML规范不到SGML规范的1/10,简单易懂,是一门既无标签集也无语法的新一代标记语言。
XML的先进特性
XML继承了SGML的许多特性,首先是可扩展性。XML允许使用者创建和使用他们自己的标记而不是HTML的有限词汇表。这一点至关重要,企业可以用XML为电子商务和供应链集成等应用定义自己的标记语言,甚至特定行业一起来定义该领域的特殊标记语言,作为该领域信息共享与数据交换的基础。
其次是灵活性。HTML很难进一步发展,就是因为它是格式、超文本和图形用户界面语义的混合,要同时发展这些混合在一起的功能是很困难的。而XML提供了一种结构化的数据表示方式,使得用户界面分离于结构化数据。所以,Web用户所追求的许多先进功能在XML环境下更容易实现。
第三是自描述性。XML文档通常包含一个文档类型声明,因而XML文档是自描述的。不仅人能读懂XML文档,计算机也能处理。XML表示数据的方式真正做到了独立于应用系统,并且数据能够重用。XML文档被看作是文档的数据库化和数据的文档化。
除了上述先进特性以外,XML还具有简明性。它只有SGML约20%的复杂性,但却具有SGML功能的约80%。XML比完整的SGML简单得多,易学、易用并且易实现。另外,XML也吸收了人们多年来在Web上使用HTML的经验。XML支持世界上几乎所有的主要语言,并且不同语言的文本可以在同一文档中混合使用,应用XML的软件能处理这些语言的任何组合。所有这一切将使XML成为数据表示的一个开放标准,这种数据表示独立于机器平台、供应商以及编程语言。它将为网络计算注入新的活力,并为信息技术带来新的机遇。目前,许多大公司和开发人员已经开始使用XML,包括B2B在内的许多优秀应用已经证实了XML将会改变今后创建应用程序的方式。
从1998年开始, XML 被引入许多网络协议,以便于为二个软件提供相互通信的标准方法。简单对象访问协议(SOAP)和 XML- RPC规范为软件交互提供了独立于平台的方式,从而为分布式计算环境打开了大门。几乎所有主要的软件厂商都支持SOAP。SOAP的快速成功史无前例地提高了软件的互操作潜力。当今,Web服务革命正在兴起,而SOAP正是其基础协议。
我们为什么需要 XML?
HTML 始终是最成功的标记语言。您几乎可以在任何设备(从掌上电脑到大型机)上查看最简单的 HTML 标记,并且您甚至可以用合适的工具将 HTML 标记转换成语音和其它格式。既然 HTML 成功了,为什么 W3C 还要创建 XML 呢?为了回答这个问题,请查看下面这个文档:
Mrs. Mary McGoon
1401 Main Street
Anytown, NC 34829
HTML 的问题在于它是为人设计的。即使不用浏览器查看上面的 HTML 文档,您和我也会知道那是某个人的邮政地址。(具体而言,它是美国某个人的邮政地址;即使您一点也不熟悉美国邮政地址的格式,您可能也会猜出这表示什么。)作为人,您和我具有理解大多数文档的含义和意图的智慧。遗憾的是机器不能做到。尽管这个文档中的标记告诉浏览器如何显示该信息,但标记没有告诉浏览器信息是什么。您和我知道它是一个地址,但机器不知道。
显示 HTML
要显示 HTML,浏览器只需遵循 HTML 文档中的指令即可。段标记告诉浏览器在新的一行显示,并且通常在前面有一个空行,而两个换行标记则告诉浏览器前进到下一行,并且行之间没有空行。尽管浏览器出色地将文档格式化,但机器仍不知道这是地址。
处理 HTML
为了完成对样本 HTML 文档的讨论,请考虑从该地址抽取邮政编码的任务。下面是一个在 HTML 标记中查找邮政编码的算法(我有意使用脆弱的算法),如果您找到有两个 标记的段落,那么邮政编码就是第二个换行标记下面第一个逗号之后的第二个词。
尽管该算法对于这个示例起作用,但对于全世界许多完全有效的地址,该算法根本不起作用。即使您可以编写算法来找出任何用 HTML 编写的地址的邮政编码,但许多具有两个换行标记的段落根本不包含地址。即便有可能编写算法来查看任意 HTML 段落并找出其中的任意邮政编码,也是极其困难的。
样本 XML 文档
现在让我们来看一个样本 XML 文档。使用 XML,您可以给文档中的标记赋予某种含意。更重要的是,机器也容易处理这样的信息。您只需通过找到 和 标记之间的内容(技术上称为 元素),就可以从该文档抽取邮政编码。 Mary McGoon 1401 Main Street Anytown NC 34829 标记、元素和属性 有三个通用术语用来描述 XML 文档的组成部分:标记、元素和属性。下面的样本文档说明了这些术语: Mary McGoon 1401 Main Street Anytown 34829 标记是左尖括号(<)和右尖括号(>)之间的文本。有开始标记(例如 )和结束标记(例如 ) 元素是开始标记、结束标记以及位于二者之间的所有内容。在上面的样本中, 元素包含三个子元素。
XML和HTML的主要区别是什么
XML是用来存放数据的;XML不是HTML的替代品,XML和HTML是两种不同用途的语言。XML是被设计用来描述数据的,重点是:什么是数据,如何存放数据。HTML是被设计用来显示数据的,重点是:显示数据以及如何显示数据更好上面。HTML是与显示信息相关的, XML则是与描述信息相关的。
XML 什么也不做
XML 被设计成什么都不做的。也许看起来很难理解,但事实上XML确实什么都不做。XML只是用来组织、存储和发送信息的。下面的例子是Ordm给Lin的便条,使用的是XML格式: LinOrdmReminderDon't forget me this weekend!
这个便条有信息头,又信息主体,还包括发送人和接收人。尽管如此,这个XML文档仍然什么都不做,他只是用XML标记存储信息的文件。有人已经编写出来发送和接收并且显示这种格式信息的软件。
XML是自由的、可以扩展的
XML标记并不是预先规定好的,你必须创造你自己的标记。在HTML文档中必须使用规则中定义好的标记。XML允许你定义自己的标记以及文档结构。 比如在上面例子中的""、""标记都不是在XML规范中事先定义好的。这些标记都是XML文档的作者“创造”出来的。
XML是HTML的补充
XML并不是HTML的替代品。XML并不是HTML的替代品,理解这一点非常重要。在将来的网页开发中,XML将被用来描述、存储数据,而HTML则是用来格式化和显示数据的。对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理信息的工具。
XML在未来Web开发中的应用
XML无处不在。XML发展的非常迅速,这实在令人感到惊奇,有很多的软件开发商都采用了XML标准。我们相信,在未来的Web开发中,XML将和HTML一样受到重视,他们都是Web技术的基础。XML将成为最普遍的数据操纵和数据传输的工具。
XML 笑话
问: 我该在什么时候使用XML?答: 你可以在你的个人简历中写上你会XML。
如何使用XML?
首先要明确的是:XML是被设计用来存储数据、携带数据和交换数据的,他不是为了显示数据而设计的。
XML可以从HTML中分离数据
通过XML,你可以在HTML文件之外存储数据。 在不使用XML时,HTML用于显示数据,数据必须存储在HTML文件之内;使用了XML,数据就可以存放在分离的XML文档中。这种方法可以让你集中精力去到使用HTML做好数据的显示和布局上,并确保数据改动时不会导致HTML文件也需要改动。这样可以方便维护页面。XML数据同样可以以“数据岛”的形式存储在HTML页面中。你仍然可以集中精力到使用HTML格式化和显示数据上去。
XML用于交换数据
通过XML,我们可以在不兼容的系统之间交换数据。 在现实生活中,计算机系统和数据库系统所存储的数据有N^N种形式,对于开发者来说,最耗时间的就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据是的复杂性,并且还可以使得这些数据能被不同的程序读取。
XML 和 B2B
使用XML, 可以在网络中交换金融信息。在不远的将来,我们可以期望看到很多关于XMl和B2B(Business To Business)的应用。XML正在成为遍布网络的商业系统之间交换金融信息所使用的主要语言。许多与B2B有关的完全基于XML的应用程序正在开发中。
XML可以用于共享数据
通过XML,纯文本文件可以用来共享数据。既然XML数据是以纯文本格式存储的,那么XML提供了一种与软件和硬件无关的共享数据方法。这样创建一个能够被不同的应用程序读取的数据文件就变得简单了。同样,我们省级操作系统、升级服务器、升级应用程序、更新浏览器就容易多了。
XML可以用于存储数据
利用XML, 纯文本文件可以用来存储数据。大量的数据可以存储到XML文件中或者数据库中。应用程序可以读写和存储数据,一般的程序可以显示数据。
XML可以充分利用数据
使用XML,你的数据可以被更多的用户使用。 既然XML是与软件、硬件和应用程序无关的,所以可以使你的数据可以被更多的用户、更多的设备所利用,而不仅仅是基于HTML标准的浏览器哦。别的客户端和应用程序可以把你的XML文档作为数据源来处理,就像他们对待数据库一样,你的数据可以被各种各样的“阅读器”处理,这时对某些人来说是很方便的,比如盲人或者残疾人。
XML可以用于创建新的语言
XML是WAP和WML语言的母亲。无线标记语言(WML,The Wireless Markup Language ), 用于标识运行于手持设备上(比如:手机)的Internet程序。WML采用了XML的标准。你可以在WML 指南中详细的了解。
展望未来
如果开发者有足够的预见性,那么将来的应用程序都应该使用XML的形式来此存储数据。将来我们所使用的字处理器、电子表格软件和数据库应该能够以纯文本的格式相互读取数据,而不需要经过格式转化的过程。我们只能期盼微软和其他软件开发商也赞同这一点。//事实上微软正在大力发展XML的应用呢。
XML到底能做什么?
首先说,xml的技术有两项的很显著的特点。
1,数据和现实的分离。
下面我就从这两个方面,结合自己的经验和丛书中了解的知识,简单的谈一下。
第一:数据和现实的分离。
比如说你手头上有一篇的资料(我们这里先假定是文字的资料,因为如果涉及到图,影像等范围就太广了,也不是我只能力所及),是xml的数据的格式,好了,如果你的客户想通过互联网看看你的资料。你就可以使用一个aaa.xsl把你的xml的数据格式化为HTML的格式,同时这里面有个补充一点,因为你可以控制你要显示的内容,你可以过滤掉对于客户不能看到的信息。但是这里面你并没有动原来的数据。
如果你的老板想把资料打印出来,作为报表向上级汇报,还是用原来的数据,再写一个bbb.xsl,把xml的数据输出为一个漂亮的报表的形式。ok了。
如果你以前的数据是txt的格式,你就必须从新的要做两种的格式, 一个html的,一个报表的。你的工作最多时copy,copy的
2,数据的自描述性。
比如说我的个人信息。 对于数据库来说,可能建立一个users的表。建立不同的字段。 数据取得可以是 rs("name")="jiangtianpeng" rs("Emial")="wfxian@263.net" rs("Id")="dadapeng" 但是没有了rs或者对于外部来说又如何的区分id和name的区别。 dadapeng是id?还是name? jiangtianpeng是name?还是id?
ok 用xml描述一下个人信息
jiangtianpeng dadapeng china .... wfxian@263.net
是不是一目了然。 实际上面的问题就涉及到了不同系统之间的xml的交换。xml是不同系统之间的桥梁。
我谈一下我工作的xml经验 。我现在的工作是一个中文,英文,俄文三种语言的网站,比如我们通过com组件的得到一个用户的信息可能是
name_RU='这里是俄文'。。。。等等的信息/>
在中文上就写一个显示中文的xsl, 在英文上就写一个显示英文信息的xsl。
如果不用这种技术,将会很麻烦的。
XML使用实体 XML 的实体机制是一种节省大量时间的工具,而且也是将多种不同型态的数据并入XML 文件中的方法。在XML 文件中,你可以将经常使用的XML 文字区段定义成实体,可以快速地将XML文字加入到你需要的任何地方,也可以将外部的档案定义成实体,然后将档案的数据附加到文件;这些数据可以由XML 本文或其它的文字或非文字数据所组成。 你可以使用类似用来在有效的XML 文件中宣告元素或属性的语法,在文件型态定义(DTD)中进行实体的定义。第五章已经讨论过DTD 与文件的型态宣告。 在本章中,首先你将学到一些使用实体的基本技巧,以及为实体进行分类的方法。接着你将学到如何宣告每一种不同的实体型态,以及如何将实体加到文件中需要的地方。再来你将学习如何使用两种可以让你将任何型态字符加入到各种本文中的XML 特性:字符参照与预先定义实体。最后本章将以实作的练习作为结束,让你对于在有效的XML 文件中运用实体能够有更多的实际经验。 实体的定义与分类 XML 的规格书中将「实体」这个词汇做了广泛的应用,一般的意思是指与XML 文件相关联的任何下列型式的储存单元。 有效的XML 文件本身 外部的DTD 子集(已于第五章的 <使用外部DTD 子集> 中做过讨论) 定义成DTD 中外部实体的外部档案,以及实体参照的运用 在DTD 中定义内部实体的引号包围字符串,以及实体参照的运用 笔者将扼要地定义最后两项。注意列表中的前三类储存单元都是档案,而最后一项则是引号包围的字符串。 然而,本章将实体用在较狭义的领域:参考最后两项的储存单元-那就是,在文件中的DTD 中定义成外部档案或引号包围字符串,并在文件中以实体参照的方式运作。例如,下面的DTD 将外部档案Topics.xml(一个拥有包含在文件中全部文章所涵盖的标题列表的档案)定义成名为topics 的外部实体,并且将引号包围字符串(「A Short History of XML」)定义成名为title 的内部实体:[ ]> 你可以借着简单地含括实体参照&topics,来将标题的完整列表放在文章中你需要的任何地方(例如,在摘要、序文或结论)。如下列的元素所示: This article will cover the following topics:&topics; 接下来你就可以含括实体参照&title 来将文章放在需要的地方;如元素所示: Title:&title;Author:Michael Young 实体的机制对于储存常用的XML 文字区段特别有用。例如,如果文章标题遍布在文章里多个位置,使用实体(如之前范例中所示)能减少输入,帮助确保一致性,并且让修改标题变得更容易。你也可以借着简单地在DTD 中编辑实体宣告来修改整个标题,大概如下所示: 如果你恰巧是个程序设计人员,你将发现XML 实体机制与程序语言中定义的常数之间的相似性(如C 里面那些使用#define 处理器指令进行宣告的常数或函式)。如同你稍后将见到的,实体机制也是将非XML 的数据含括到XML 文件中不可或缺的要项,例如影像的图形数据。实体的型态 实体在刚开始可能会让人有点迷惑,因为它们是以这么多种不同的方式出现。虽然在这个章节中出现的范例都有点抽象(在你见到细节部分与范例之前),但是了解这些讯息应该会让你在实体上的学习变得更容易。 实体利用下面三种方式进行分类: 一般的vs.参数的 。一般实体(general entity)包含了文件的内容。意即,可以用在文件元素内的XML 文字、其它的文字,或非文字数据。前面章节中所介绍的实体范例(title 与topics)都是一般实体。参数实体(parameter entity)则包含了可以被安插在DTD 中的XML 文字。在XML 的规格书中,无条件限制的实体这个词汇是指一般实体。 内部的vs.外部的 。内部实体(internal entity)是一个包含在引号包围字符串内的实体(如前面章节中的title 实体)。外部实体(external entity)则是包含在个别档案中的实体(如前面章节中的topic 实体)。 已解析的vs.未解析的 。已解析的实体(parsed entity)是由XML 文字(字符数据、卷标或两者皆有)所组成的实体。当你把对已解析实体的参照放入文件时,该参照会被换成实体的内容数据(也称为置换本文(replacement text)),变成文件内容的一部份。XML 解析器会以扫描文字的方式对实体的内容进行处理。前面章节中所介绍的两个实体范例(title 与topics)都是已解析的实体。 而未解析的实体则是包含了各种型态的数据:XML 资料,或占了大多数的非XML资料。非XML 数据可以是文字数据(如标题),或非文字数据(如影像的图形数据)。因为未解析实体通常不包括XML,所以它的内容并不是透过实体参照的方式直接放入文件中。然而,你可以将实体的名称指定成ENTITY 或ENTITIES 型态属性,如此应用程序便可以使用实体的名称与叙述,并对数据进行任意的处理。 因为实体可以利用这三种方式来进行分类,而且每种方法都有两个类别,所以理论上实体可以分成八种,如下图所示: 然而,XML 并未提供图形外的三种实体型态,所以XML 只有五种实体类型,你将在本章中学得如何定义及使用这些属性型态: 一般内部已解析实体 一般外部已解析实体 一般内部未解析实体 参数内部已解析实体 参数外部已解析实体宣告一般实体 你可以借着在文件的DTD 中宣告实体来建立实体。借着使用一种类似用来宣告元素与实体的卷标类型来为实体进行宣告。在接下来的章节中,你将学习如何宣告各种一般实体。宣告一般内部已解析实体 对一个一般内部已解析实体的宣告可以利用下列的格式: 这里的EntityName 是实体的名称。你可以选择遵循下列这些规则而来的任何名称: 名称必须以字母或底线(_)开始,后面接着零或多个字母、数字、句号(.)、连字号(-),或底线(_)。 实体可以拥有与位在文件中的参数实体相同的名称(一般实体与参数实体使用不同的命名空间(namespaces))。实体也可以拥有与元素或属性相同的名称。 记住,字母的大小写在所有的卷标,包括实体名称中的所有文字中,是不同的。因此,一个名为Bowser 的实体与名为bowser 的实体是不同的。 实体值(EntityValue)就是实体的数值。你指定给一般内部实体的数值是一连串包含在引号内的连续字符,称之为引号包围字符串或literal。你可以为一般内部实体指定任何的值,只要遵循下列的规则即可: 字符串可以包含在单引号(')或双引号(")内。 字符串中不能包含用来包围字符串的引号字符。 字符串中不能包含(&)字符,除了用来作字符引号或实体参照的起始。同样地,字符串中也不能包含百分比字符(%)。(有关例外的状况,请参阅 http://www.w3.org/TR/REC-xml 的XML 规格书中的第四部分。) 当然,字符串的内容对于你想放置实体的位置必须是正确的。例如,如果你想将实体放置在元素之中,它必须包含一个或多个可以被合法地放置在元素(套迭元素、字符数据,以及其它在第三章 <元素内容的类型> 所介绍的数据等等)中的项目。或者,如果你在属性值内插入一个实体,它必须包含合法属性规格的字符(如同第三章 <合法属性值的规则> 中所介绍的)。本章稍后将介绍你可以放置一般内部已解析实体的位置。 例如,下面的DTD 定义了一个名为title 的一般内部已解析实体:[ "The Story of XML The Future Language of theInternet">]> title 实体包含了字符数据加上一个元素(SUBTITLE)。根据位于DTD 中的宣告部分,该内容只能正确地放置在TITLEPAGE 元素中,如下所示: Title:&title;Author:Michael Young XML 解析器将把实体参照(&title;)的部分替换成实体的内容,并且将这些内容如同你将文字输入到文件中相同位置的方式来进行处理,就像这样: Title:The Story of XML The Future Language of the InternetAuthor:Michael Young宣告一般外部已解析实体 一般外部已解析实体的宣告拥有下列的格式: 这里的EntityName 是属性的名称。只要你遵守一般外部已解析实体的命名规则,你可以选择任何的名称。 SystemLiteral 则是负责描述包含实体数据文件其地址的系统literal。这些系统literal 可以使用单引号(')或双引号(")来包围,并且可以包含任何的字符,除了被用来作包围字符的引号字符以外。 系统literal 指定了包含实体数据文件的统一资源识别代号(URI)。目前,URI 在本质上与标准的网络地址相同,一般称为统一资源寻址器,或URL。你可以使用完全符合规定的URL,如: 或者你可以使用部分的URI,该URI 指定了相对于包含该URI 的XML 文件位置的相对位置,例如: 在XML 文件中相对的URI 都是利用与位在HTML 网页中相对URL 运作的相同方式来运作。想获得更多URI 的相关信息,请参阅第五章 <使用外部的DTD 子集> 中的介绍。 外部实体的档案可以只包含那些能够合法地被安插在元素(如第三章的 <元素内容的类型> 中所介绍的字符数据、套迭元素等等)之中的项目。如同你在本章稍后将学到的,最终你只能将一般内部已解析实体放置在元素的内容之中。(你可以将实体含括在内部实体宣告的数值内,但是你接着必须将该内容安插到元素内。)例如,下面的DTD 将外部档案Topics.xml 定义成一般外部已解析实体:[ ]> 下面是Topics.xml 档案的内容: TopicsThe Need for XMLThe Official Goals of XMLStandard XML ApplicationsReal-World Uses for XML 这个特殊的外部实体档案包含了两个你可以含括在XML 元素中的项目:套迭元素与字符数据区块。实体的内容可以正确地被安插在INTRODUCTION 元素中(该元素可以拥有任何型态的内容),如这个范例所示: Here 's what this article covers:&topics;宣告一般外部未解析实体 一般外部未解析实体的宣告是以下面的格式进行: 这里的EntityName 是实体的名称。只要遵守本章前面 <宣告一般内部已解析实体> 中所介绍一般实体的命名规则,你可以选择任何名称来当作实体名称。 SystemLiteral 则是系统literal,用来描述包含了实体数据的档案所在位置。它运作的方式和之前介绍的系统literal 一样,都是用来描述一般外部已解析实体的位置。注意 关键词NDATA 代表的是包含解析过数据的实体档案。 NotationName 是在DTD 中宣告的标签名称。该卷标描述了包含在实体档案中数据的格式,或指定了负责处理该数据的程序所在位置。下一个章节将会讨论标签的宣告。 未解析外部实体档案包含了任何格式的文字或非文字数据。当然,它应该符合由指定规格所提供的格式叙述。 例如,下面XML 文件中的DTD 将档案Faun.gif(包含书本封面的影像)定义成一般外部未解析实体,名为faun。该实体卷标名称为GIF,被定义成指向负责以GIF 格式显示图像的程序(ShowGif.exe)的所在位置。DTD 同时也定义了名为COVERIMAGE 的实体元素,以及名为Source 的元素型态属性ENTITY: [ >]> Nathaniel Hawthorne 在文件的元素中,COVERIMAGE 元素的Source 属性被指定成外部实体的名称,该实体包含即将被显示的封面图像的图形数据。因为Source 拥有ENTITY 型态,所以你可以指定其值为一般外部未解析实体的名称。事实上,你能够使用这种型态的实体的唯一方法就是将其名字指定成ENTITY 或ENTITIES 型态的属性。 注意 不像外部已解析实体的档案,一个外部未解析实体档案并不能直接被XML 处理器存取。更确切地说,处理器只是让实体与其卷标能够让应用程序使用,该程序可以对信息进行随意的处理。(例如,它可能会执行与卷标结合的程序并让程序显示实体档案中的数据。)在第九章中,你将学习到如何撰写可以存取实体与卷标的网页script。宣告标签 卷标描述了一种特殊的数据格式。它是借着提供该格式描述的位置、可以处理该种格式数据的应用程序位置,或简单的格式叙述等方式来提供数据格式。你可以使用标签来描述一般外部未解析实体(如你在前面章节中所见到的)的格式,或者你可以为拥有NOTATION 列举数据型态(如同第五章中的 <设定列举型态> 所介绍的)属性指定卷标。标签拥有下列一般格式: 这里的NotationNam 是标签的名称。你可以选择任何你想要的名称,只要是以字母或底线(_)起始,后面接着零或多个字母、数字、句点(.)、连字号(-),或底线(_)。你应该选择一个有意义的名称来代表该格式。例如,如果你想定义卷标来描述图形文件,你可以将它命名为BMP。 SystemLiteral 则是系统literal,可以使用单引号(')或双引号(")来包围,而且可以包含任何的字符,除了用来作包围用的引号以外。你可以将任何可能对负责显示或处理XML 文件的应用程序有意义的格式叙述含括在系统literal 中。(记住,XML 处理器本身并不会使用这些信息;它只是单纯地将它传送给应用程序,而应用程序可能是网页中的script。)例如,你可以含括下列系统literal 的任何一个: 可以处理或显示的数据格式应用程序的URI,如下面范例中所介绍的: 描述格式的在线文件的URI,如: "http://bogus.com/StrangeFormat.htm"> 格式的简单描述,如: 请参阅第五章中的 <使用外部的DTD 子集> 以取得更多URI 的信息与范例。宣告参数实体 你可以使用类似用在一般实体上的卷标宣告来宣告一个参数实体。在下面的章节中,你将学到如何宣告两种参数实体。宣告内部已解析参数实体 内部已解析参数实体的宣告拥有下列的格式: 这里的EntityName 是实体的名称。你可以选择任何的名字,只要遵守下面这些规则: 实体的名称必须由字母或底线开头(_),后面接着零个或多个字母、数字、句点(.)、连字号(-)、或底线(_)。 实体可以拥有和文件中一般实体一样的名字。(参数实体与一般实体使用不同的命名空间。)实体也可以拥有和元素或属性相同的名称。 字母的大小写在卷标的所有文字中都是不同的,包括实体名称。因此,名为Spot的实体当然与名为spot 的实体是不同。 EntityValue 是实体的值。你赋予参数实体的值是一连串被引号包围的字符串,称为引号包围字符串(quoted string)或literal。你可以将任何的literal 值指定给参数实体,只要遵守下面的规则即可: 字符串可以用单引号(')或双引号来包围(")。 字符串中不能包含与用来包围字符串相同的引号字符。 字符串不能包含百分比(%)字符,也不能包含(&)符号字符,除非使用字符参照或一般实体参照才行。 你只能将参数实体加到DTD 中卷标宣告可以出现的地方,而不是放在标签宣告中。因此,EntityValue 字符串必须包含一个或多个DTD 允许型态的完整卷标宣告。第五章的 <建构一个DTD> 中已介绍过标签宣告的格式。 尤其是,参数实体可以包含元素型态宣告、属性列表宣告、一般实体宣告、卷标宣告、处理指令,或批注(参数实体宣告与参照并不被允许)。 注意 在这里规定的实体值规则,可以适用在任何状况下,这些规则是XML 规格的简化版本。这些规格-在某些情况下-允许你包含额外的项目于属性值中,并且在卷标以及卷标宣告中含括实体参照。详细的内容,请参阅 http://www.w3.org/TR/REC-xml 的XML 规格的第四部分。 例如,下面的DTD 宣告了一个名为author 的内部已解析实体参数,该实体包括三个卷标宣告:批注、元素型态宣告,与属性列表宣告。实体的内容(意即,它的替换文字)会借着数种参数实体参照(%author;),被加入DTD 的底部:[ " "> %author;]> 注意,包含在实体宣告中的预设属性值是利用单引号包围('American'),以避免使用那些被用来包围整个实体值的相同引号。上面的DTD 与下面这个是相等的:[ ]>宣告参数外部已解析实体 参数外部已解析实体的宣告拥有下列的一般格式: 这里的EntityName 是实体的名称。你可以选用任何遵守前面章节中介绍的参数实体命名规则的名称。 SystemLiteral 是一个描述包含实体数据文件位置的系统literal。这个系统literal 可以使用单引号(')或双引号(")来包围,而且它可以包含任何字符,除了被用作包围的引号字符外。 系统literal 指定了包含参数实体数据文件的URI,URI 在本质上与标准因特网的统一资源定位器(URL)是相同的。你可以使用完整的URL,例如: SYSTEM "http://bogus.com/documents/Declarations.dtd"> 或者,你可以使用部分的URI,该URL 指定了一个相对于包含XML 文件位置的相对位置,例如: 如同稍早提到的,在XML 文件中相对的URI 的运作就像HTML 网页中的URL 一样。想获得更多URI 的信息,请参阅第五章中的 <仅仅使用外部的DTD 子集> 。 参数外部实体的档案必须包含DTD 中允许型态的有效卷标宣告。特别是,它可以包含元素型态宣告、属性列表宣告、实体宣告、标记宣告、处理指令或批注。(第五章的<建构一个DTD>中已描述过这些卷标宣告的型态。)你也可以包含参数实体参照与IGNORE 与INCLUDE 区段(第五章的<外部DTD 子集中的条件式忽略区段>中亦介绍过IGNORE 与INCLUDE 区段。)你可以使用参数外部已解析实体来储存相关宣告的群组。举个例子来说,假设你的企业是贩卖书籍、CD、邮票等。你可以将每一种项目的宣告放在个别档案。你被允许用不同的方式来结合这些宣告的群组。例如,你可能想要建立一份只描述书籍与CD 库存的XML 文件。要做到这点,你可以藉由使用参数外部已解析实体,将书籍与CD 宣告包含在文件的DTD 中,就像这个范例XML 文件中所示: [ %book_decls;