4.6.2 XML文档的组成结构

4.6.2 XML文档的组成结构

1.XML文档的数据结构

XML文档是一种结构化的标记文档,它以结构化的方式来描述各种类型的数据,具体说来,XML文档在逻辑上是树状结构,如图4-31所示。

图4-31 XML文档数据结构

在这种结构中,有且只有一个节点没有父节点,这个节点称为根节点。除此以外,其他节点有且只有一个父节点。理论上说一个XML文档可以包含任意深度、任意个数的子节点,但实际系统中由于受到存储条件和处理能力的限制,规定了子节点最大的深度和个数。

2.XML文档的基本规定

W3C为避免HTML标准不严格带来的问题,为XML制定了更严格的语法规则,有利于XML解析器解析XML文档,为数据交互共享提供了语法保证。XML文档基本的语法规则列举如下。

(1)XML文档有且只有一个根元素

XML文档的根元素包含所有被视为文档数据内容的单个元素。根元素是在文档的序言码部分后出现的第1个元素,也称为文档元素。在【例4-27】中,book就是该文档的根元素。

(2)所有的XML元素必须包含结束标签

XML文档中所有的元素都必须具有结束标签,否则XML文档在语法检查中将不能通过。

(3)元素名区分大小写

(4)元素的开始标签和结束标签的名称必须相同

XML区分大小写,因此结束标签名称必须与其伴随的开始标签名称完全匹配。

(5)XML元素不能交叉嵌套

如果一个元素的开始标签出现在另一个元素中,则该元素的结束标签也必须包含在其中。

(6)所有的属性都必须使用引号

属性值必须用单引号或者双引号括起来。因此username=xiaoming这样的写法是无效的,应该写成username=“xiaoming”。

表4-11 XML中的转义字符表

3.XML文档的基本结构

下面通过一个简单的XML文档来介绍文档的组成部分。

【例4-28】简单的XML文档示例。

XML文档的逻辑结构由以下几个部分构成:XML声明、处理指令、注释、根元素、元素、属性、CDATA。

(1)XML声明

XML声明是XML文档的第1行。声明语句的信息主要包括XML版本信息、使用的字符集、是否是独立文档等。上例中XML文档的声明语句是:

该语句说明XML的版本号是1.0,字符编码是GB2312,这便于XML解析器了解该XML文档的基本信息,以调用合适的处理模块。

(2)处理指令

处理指令是用来给处理XML文档的应用程序提供信息的,XML解析器把这些信息原封不动地传给应用程序,由应用程序来解释这个指令,遵照它所提供的信息进行处理。处理指令应该遵循下面的格式:

如例中的处理指令?xml-stylesheet type=“text/xsl”href=“books.xsl”?,说明XML文档引用了外部的books.xsl文件用以定义文档的显示方式。

(3)注释

XML文档可以包含注释,用于在XML文档中提供必要的说明以提高文档的可读性。注释以“!--”开始,并以“--”结束。在这些字符之间的文本会被XML解析程序忽略。上例XML文档中注释如下:

使用注释是一个良好的习惯,但要注意注释不能出现在XML文档中的第1行,否则XML处理程序会出错。

(4)根元素

根元素是XML文档的主要部分。根元素包含文档的数据以及数据结构的信息。在【例4-28】中,包含在books和/books之间的部分为根元素。在XML文档中,根元素有且只能有一个。

根元素中的信息存储在两种类型的XML结构中:元素和属性。XML文档中使用的所有元素和属性都嵌套在根元素中。

根元素是整个XML文档的主要部分,根元素中可以包含其他的元素,在这个例子中它包含了两个book元素,而book元素中又包含了其他的元素如booktitle和author元素。

(5)元素

元素是XML文档的基本结构单元,用于存放和组织数据。XML元素是以树状结构组织的。XML元素包含开始标签、元素内容和结束标签。由于XML区分大小写,所以,开始标签和结束标签必须完全匹配。元素内容可以包含文本、其他元素、字符引用或字符数据部分。在【例4-28】中,book和/book之间,author和/author之间均是元素。book元素除了含有booktitle和author元素外,还含有category属性。

没有内容的元素称为空元素。空元素的开始标签和结束标签可以合并为一个标签,如book/。

(6)属性

元素的开始标签中可以包含属性,用于包含元素的额外信息。属性包含属性名称和属性值,使用等号分隔属性名称和属性值。属性值包含在单引号或者双引号中。当属性值本身含有单引号时,则用双引号作为属性的界定符,当属性中既包含单引号,又包含双引号时,属性值中的引号必须用实体引用方式来表示。

一个元素不能拥有相同名称的两个或者多个属性,不同的元素可以拥有两个相同名称的属性,例如下面的例子是不合法的,因为出现了两个名称相同的属性category。

book category=“IT“category=“chi ldren“

【例4-28】中unit是price元素的一个属性,元素可以含有一个或者多个属性,但是属性名不能重复。同名的属性可以出现在多个元素中,如unit属性也可以出现在别的元素中。

(7)CDATA

在前面已经指出,出现在元素内容中的特殊字符如“”“”等必须使用转义字符表示。但对有些程序来说,如果特殊字符出现的情况比较多,使用转义字符是比较麻烦的,如数学公式中会经常用到“”“”符号。

CDATA区段就是为了解决这个问题而引入的。它用![CDATA[和]]进行定界。在CDATA区段内,所有的标识、实体引用都被忽略,而被XML解析器一视同仁地作为字符数据看待。CDATA的形式如下:

![CDATA[文本内容]]

CDATA必须放在元素内容中,CDATA的文本内容中不能出现字符串“]]”,另外,CDATA不能嵌套。

下面的例子使用CDATA区段将一个XML例子插入另一个XML文档中。

【例4-29】CDATA区段示例。

注意在CDATA节中,大量地使用了特殊字符“”“”,但是其中并没有使用转义字符。

在【例4-28】中,![CDATA[Eric Carle绘本系列、“英文原版”]]是一个CDATA区段,它使用![CDATA[和]]将要表示的字符串包含在中间。注意CDATA区段中的字符串出现了XML文档中的保留字符“”“”等,这在CDATA区段中是允许的,它会将内容原封不动地传递给处理程序。