XML 的结构
XML 的制定人员在制定这个语言时,心中已有特定的目标。为了
要达成这些目标,他们制定了相当严格的结构和语法规则。虽然刚开始时,这些规则会使XML
看起来似乎比HTML 更琐碎,但稍后您将会发现,XML 所具有的可延伸性和协同合作的能力都
是HTML 所无法比拟的。
Note
可延伸性计算机语言允许开发者延伸或修改它的语法及语意。协同合作的能力则是指应用程序间
可互相分享数据。
在这里,我们将要检视XML 文件的逻辑、实体结构,以及XML 语言是如何建立起这些结构。
当然我们也将建立与讨论一个简单的XML 文件来展示这些原则。
XML 文件的结构XML 最佳的优点之一是:它能提供一个文件的架构。每一个XML 文件都包含了逻辑结构和实体结构。逻辑结构就像一个样本,告诉您在这个文件中包含那些元素与其顺序。而实体结构则包含
文件中使用的实际数据,这些数据可能是储存在您计算机内存中的文字,也可能是在World Wide
Web 上的一个图形档案等等。
XML 中的逻辑结构如果您很熟悉HTML,您可能对逻辑结构的概念已有基本的了解。逻辑结构是文件系统中各个不
同部分的组织结构。相对于文件的内容是什么,逻辑结构则代表文件是如何被建立起来的。而
HTML 文件的逻辑结构,代表被标记在文件中的元素,如下列的文字码所示:
Title content goes hereOther Head content goes here
Body content goes here
这段文字码中的HEAD、TITLE,及BODY 等元素都包含在HTML 元素中;而TITLE 元素则在
HEAD 元素内。这个HTML3.2 文件类型定义(DTD)提供了一个如何建立一份HTML 文件的完
整规则参考,您可在下列网址中找到相关参考文
件 。
Note一份XML 文件是由宣告(Declaration)、元素(element)、处理指令(processing instructions),以及批注(comments)所组成的。其中一些组件是选择性的,而另一些则是必要的。在这里
要由建立的范例文件来检视XML 文件的基本宣告及元素,
PROLOG 元素在XML 文件中,第一个结构性的元素是选择性的前言(prolog),前言由两个基本组件构成:XML 宣告与文件类型宣告,它们也都是选择性的组件。
XML 宣告XML 宣告中定义了文件遵守的XML 规格的版本。虽然它是选择性的元素,但您还是应该在您的
XML 文件中将它包含进去。这个范例文件就是由基本的XML 宣告开始的。
Note上面的这行文字码必须使用小写字母。XML 宣告中同时也包含了编码宣告和单一文件的宣告。这个编码宣告是用来辨识字符编码系统,
像是UTF-8 或EUC-JP。不同的编码系统会对应到不同的字符格式或语言。例如预设的UTF-8
包含了绝大部分英文的字符。XML 解析器被要求必须要支持Unicode 编码标准,才能够支持大
部分的语言。
单一文件宣告是用来辨识XML 文件是否有使用外部的标签宣告。单一文件
宣告可以有一个yes 或no 的值。
Note如果读者会使用到中文的内容,则必须在后面加上中文编码的宣告:
文件类型宣告文件类型宣告由标签码组成,对特定的文件类型指示文法规则或文件类型宣告(DTD)等。文件
类型宣告也可以指向一个包含所有或部分DTD 外部的档案。
文件类型宣告必须在XML 宣告之后与其它文件元素之前出现,下面这段文字码示范如何在一个XML 文件中加入文件类型宣告:
上面这段叙述告诉XML 处理器,这份文件中有一个Wildflowers 类别,并且遵守在命名为
Wldflr.dtd 的DTD 档案中定义的规则。
跟在prolog 之后的是文件元素-XML 文件的核心及文件内容所在的地方。
文件(Document)元素对您来说,这也许有点奇怪,一个单一的文件元素包含整个XML 文件里的所有数据。然而,这
个单一元素可以包含
任何数目的巢状阶层元素和外部实体(entities)。
这有点类似您计算机上的C 磁盘驱动器。所有计算机上的数据都存在一个单一的磁盘驱动器中。但是仍然还有许多不定数目的活页夹与次阶层的活页夹保存各个不同的数据在逻辑与易于管理的结构中。下面这段文
字码示范如何把文件元素(在这个例子中加入的是PLANT 元素)加到模板文件中:
Columbine
Aquilegia canadensis
巢状结构所谓的巢状结构就是将一个对象包含在另一个对象之中,举例来说:XML 文件可以包含巢状元
素甚至是其它的文件。
元素的巢状结构建立了它们之间的父/子关系,每个子元素(不是指文件元素)是完全地包含在
它的父元素里面。
下面的文字码说明了这样的关系:
然而,下列的文字码中,是不适当巢状元素的示范:
XML 文件的实体结构XML 文件的实体结构是由文件中所有内容所组成。
如果您把逻辑结构想成是一个停车场的篮图,那您可以把停车场的空间想成是文件的实体结构。这些停车空间或保管单位称为实体,它们可以是这文件的一部分或是外部文件(就像是飞机场的
外部停车场一样)。
每个实体都有一个独一无二的名字及属于它自己的内容,包括从文件中的一个单一字符到文件外的一个大型档案。以XML 文件的逻辑结构而言,实体是在前言中被宣告的,而且在文件元素中被参照。实体宣告在告诉XML 文件的处理器,要把什么样的内容填入那个「停车空间」。只要在DTD中宣告过,这个实体就可以在文件中的任何地方被使用。一个实体的参照告诉处理器去取得实体
的内容,并且在文件中使用它。
可解析(parsed)与不可解析(unparsed)的实体实体可分为可解析与不可解析的。
可解析的实体,也叫作文字实体(text entity),这种实体的内容被处理后就成为XML 文件的一部份。而不可解析的实体可说是一个容器,它的内容可能是文字,也可能不是。如果是文字的话,其内容仍旧是无法解析的XML。可解析的实体可解析实体的目的是要让XML 处理器解读的,所以它的内容会被处理器摘录出来。在被摘录之后,被解析实体的内容会在实体所参照到的文件位置出现,变成文件文字的一部分。举例来说,
在我们的Wildflowers 文件中,一个light requirement(LR1)实体可以被宣告成:这宣告的含意为:「我宣告一个名为LR1 的实体,它的内容为light requirement:mostly shade」。此后,每当这个实体在文件中被参照时,它就会被它的内容替换。现在,您已开始看到使用实体的好处,也就是说,如果您想要改变这个实体的内容时,只需要在宣告它的地方改变它的内容即可,而这项改变将会反映到文件中任何用到这个实体的地方。实体参照如上面所提到的,每一个实体的内容会被加到文件中每个实体参照到的位置。实体参照如同是内
容创作的「容器」,而XML 处理器会将真正的内容在每个实体参照的地方置换。
要将实体参照加入文件中,得先插入「&」符号,然后输入实体的名字,跟着是分号「;」。
以上面的LR1为例,我们将插入「&LR1;」,内容会如下文所示:Wild Ginger has the following &LR1;当处理器处理协同合作的能力到这行时,实体「&LR1;」将会以实体的内容取代。所以,这行将被解析为「Wild Ginger has the following light requirement: mostly shade.」。参数实体参照另外一种实体参照是参数实体参照。
参数实体参照使用「%」代替「&」,除此之外,它与任何其它的实体参照相同。「%CDF;」便是参数实体参照的一个例子
不可解析实体不可解析实体有时被称为二进制(binary)实体,因为它的内容通常是二进制的档案(例如影像)等不能直接由XML 处理器来编译的。虽然如此,不可解析实体也能包含单纯的文字,所以「二进制」这个词有点误导了它真正的意涵。不可解析实体需要跟可解析实体不同的信息:
它需要一个可以用来识别实体来源格式或类型的标记。先让我们看一个例子:
这个实体宣告表示「在GIF 标记中名为MyImage 的实体是一个二进制档案」,简单地说就是「这是一个GIF 影像」。要让这些实体宣告是有效的,这些标记必须先宣告好。标记宣告帮助XML应用程序来处理这些外部,或是二进制的档案。现在我们已经用过GIF 标记了,另一个可用的标记宣告如下:这段宣告在告诉XML 处理器,每当它遇到GIF 类型的实体时,它应该使用Gifview.exe 来处理它。正如其它的宣告一样,标记一经宣告,便能在整个文件中使用。Note实体参照中不应包含不可解析实体的名字。不可解析实体应该只在ENTITY 或ENTITIES 的属性(ATTRIBUTE)值中被提到。预先定义的实体在XML 中,某些字符有着特殊的作用,以下例来说,如「<>」及正斜线「/」 等,处理器会把
它们解译成文件的标签而不是真实的字符数据。
Bloodroot也就是说,这些和其它字符是被保留作为文件的标签,而不能被当作内容使用。如果您要将这些
字符当做数据显示,它们一定会被当作标签处理而无法显示,您必须使用实体参照将字符插入文
件中。举例来说,如果您要插入「
」这个字到文件中,您应该使用下列的叙述:
<PLANT>
在这个例子中,「<;」是「<」的实体参照,而「>;」则为「>」的实体参照。
下列是所有预先定义实体的实体参照:
实体参照代表字符
< <
> >
& &
' '
" "
Note
根据W3C 的文件,所有XML 处理器必需要能辨认预先定义的实体参照,即使这些实体不曾在
文件中宣告。虽然如此,这些实体仍被要求要在DTD 中宣告,如此才是一个效的XML 文件。
内部和外部的实体
先前的例子已经示范过内部和外部实体间的不同。内部实体并没有个别的储存单位存在,实体的
内容就在它的宣告叙述中,如下列所示:
然而,外部实体在它的宣告中参考到一个储存单位,藉由使用system 或public 辨识字符串来参
照实际内容的储存体位置。例如:system 辨识字符串提供一个指针来指示一个实体的内容可以
在哪被参照,像是URI(Uniform Resource Identifier),如下列所示:
SYSTEM
NDATA GIF>
在这个叙述中,XML 处理器必须读取Image001.gif 档案来取得这个实体的内容。
除了system 辨识字符串外,一个实体可以包含public 辨识字符串。public 辨识字符串提供一个
额外、另一种方法给XML 处理器去读取实体的内容。Public 可以用来让应用程序连接到一个公
有的文件函式库。例如:如果处理器无法经由public 辨识字符串产生应用程序所参照的位置,
它便会检查system 辨识字符串所参照的URI。
Note
当这里XML 的时候, URI 时常被用来代替大家比较熟悉的URL(Uniform Resource
Locator)。在XML 中,URI 可能是URN(Uniform Resource Name)或URL。URI 通常用来
作为Web 资源描述,而且包含在XML 规格书中。更多有关URI 的信息,请参
阅 。
下列的文字码显示public 辨识字符串的用法:
PUBLIC "-//wildflowers//TEXT Standard images//EN"
"http://www.wildflowers.com/images/image001.gif"
NDATA GIF>
当所要处理的对象为有效的公有实体时,public 辨识字符串便很有用。XML 处理器会在资源列
表中检视public 辨识字符串,确认资源是否被连接上,以及决定不需要去取得新的实体,因为
它已经有效地存在本地端了。然而,必须直到一个公有信息储存机制更广泛地被使用,system
辨识字符串才会被普遍被利用。
下面是我们已经讨论过的四种不同实体类型的摘要:
• 内部实体:实体在它的宣告里面被定义,并且在前言中被宣告。 (内部实体必是
文字)。
• 外部实体:参照到外部储存单位的实体,例如二进制的档案。 (外部实体可能是,
也可能不是文字)。
• 可解析实体:实体是由可解析的文字所组成。(一经解析后,文字就变成XML 文
件的一部分)。
• 不可解析实体:不能够被XML 处理器所解析的实体。(不可解析实体可能是,也
可能不是文字。如果是文字,它也是不能解析的文字)。
从上面的四种实体,我们又可以得到四种可能的组合:
• 内部,可解析实体:由可解析文字所组成的内部实体。
• 内部,不可解析实体:由不可解析的文字所组成的内部实体。
• 外部,可解析实体:指向可解析文字的外部实体参照。(一经解析,文字就变成
XML 文件的一部分)。
• 外部,不可解析实体:参照到二进制档案或不可解析文字的外部实体。
阅读(2413) | 评论(0) | 转发(0) |