XML程序设计(第二版)
上QQ阅读APP看书,第一时间看更新

3.2 XML文档结构

XML规范规定,XML文档由序言(prolog)、文档数据和其他三部分构成,如图3.5所示。

其中,序言部分以XML声明<?xml version="1.0"?>开始,然后是注释、处理指令、DTD声明、名称空间声明、调用转换文本语句行、注释等。XML的数据部分以一个根元素包含的数据文档为主体,根元素内包含所有数据元素、属性、字符串。其他部分是可选项,包含注释和其他非元素标签的组合。

图3.5 XML文档结构

3.2.1 XML序言

一个典型的XML序言包含如下的语句成分:

上面的语句构成了XML文档的序言。除第一行外,还有注释、DTD声明、XSL样式表转换、样式表转换的版本声明和样式表名称空间声明,共四行。注释的语法和作用前面讲过。DTD(Documents Type Definition)是专门定义XML文档中元素、属性和数据有效性的文档,它指出了与一个XML文档相关的用于定义其元素、属性和数据类型的存储单元。样式表版本声明指出当前使用的版本,而样式表的名称空间(Namespace)声明是为了扩大XML应用范围和消除元素歧义而引入的。

1.DTD

以例3.2为例进行说明。在该程序中,虽然具有XML声明,但它不是一个有效的XML文档,因为,在文档中没有对元素<hello>类型进行说明,因而无法验证此文档元素<hello>的有效性,所以说它不是一个有效的XML文档。

关于XML元素有效性的问题,类似于传统数据库中各种数据类型的定义,以及对该数据类型值的约束和限定等一套完整的机制。如在数据库的某个表中定义了“单价”字段的类型是currency,如果赋给该字段的数据值为字符或字符串时会出错,这是数据库系统为了保证数据的有效性而采取的措施,这就叫数据的有效性检验,即所谓的数据有效性问题。

为了定义文档元素的有效性,在XML 1.0规范中,引入了文档类型声明DTD。DTD必须出现在文档中第一个元素的前面。DTD分为内部和外部DTD。有关内部和外部DTD的内容请参考4.4。

2.XML表单

浏览器在解析和显示XML文档时没有附加任何格式信息,所以只要是结构良好的XML文档,浏览器均以根元素的树状结构形式显示出来。这种显示方法无法满足Web应用,需要引入专门的转换技术对XML文档进行转换,目前主要使用CSS和XSL两种技术。用这两种技术编写的文档称为XML表单文件,简称XML表单。

3.名称空间

名称空间本身不是XML规范包含的内容。引入名称空间的主要原因有两点:当文本中出现不同的对象使用相同元素标签的情况下,可以消除同名带来的命名冲突,解决浏览器解析时产生名称歧义的问题。另外,在应用程序调用XML文档数据时,因为有名称空间定义,可以直接使用XML文档中的元素,且不产生任何错误。

3.2.2 XML数据

数据是XML文档的主体部分,必须有一个根元素开头,所有的数据都包含在这个根元素中。如果XML文档不包含任何内容,这个根元素也必须存在,否则文件是非法的XML文档,也就是说,一个XML文档必须包含一个顶级元素,哪怕它是空,也必须存在,否则该文档将被视为非法的XML文档,这个顶级元素就是根元素。

例如:

<?xml version="1.0" encoding="gb2312"?>

<book/>

尽管这个XML文档,除声明外没有任何内容,根元素是空元素,但它是一个合格的XML文档。

从处理数据的形式上看,XML数据大体分为以数据为中心和以文本为中心两大类。

1.以数据为中心

以数据为中心的XML文档,一般具有可以转化为表格形式的数据形态,如例3.1可以用表3.2表示。因此在如何判断XML文档是否以数据为中心,只要看它的数据大体上能否与一个表格相对应。

表3.2 表示例3.1的表格

对于以数据为中心的XML文档,可以把它作为关系数据库中的表使用,每个元素对应数据表的列元素(字段),每一个包含下一级子元素的元素可以看成是一条记录(如book),而根元素可以当作数据库的表名使用(如booklist)。这样的转换,使人容易想到把XML文档作为数据库的表格看待。如何把XML文档作为数据库使用,问题并不像上面这个例子这么简单,对于结构复杂的,多层嵌套且嵌套无规则的,转换就存在问题,因此XML的数据库研究成了近年来的研究热点,并把XML数据库称为半结构数据库。这个内容超出了本书讨论的范围,感兴趣的读者可以参考有关半结构数据库方面的研究文献和书籍。

2.以文本为中心

下面是一个以文本为中心的XML文档示例。这个文本中,数据主要是文本,各个文本长短不一,没有结构。

例3.10 以文本为主的XML文档。

上面的文本在浏览器中出现的形态没有以数据为主的那样结构严谨,层次不清晰,而是显得杂乱无章,如图3.6所示。以文本为主是今天Web应用中的主要形式之一,所以,研究文本为主的XML文档与研究以数据为主的XML文档一样的重要。由于结构松散,文本为主的XML文档直接转换成传统数据库的表格不是人们研究的重点。

图3.6 文本为主的XML数据显示