第1章 XML概述
本章目标
■ 了解XML的历史
■ 了解XML的特点
■ 了解XML的基本特征
■ 掌握XML的文档结构
■ 掌握XML文档的组成要素及其使用
■ 掌握格式良好的XML文档规则
■ 了解有效XML文档的实现方式
■ 掌握基本XML文档的编写
学习导航
任务描述
【描述1.D.1】
使用XML描述学生信息,并使用IE浏览器查看数据结果。
【描述1.D.2】
创建含有中文字符的XML文件,并使用IE浏览器查看数据结果。
【描述1.D.3】
创建XML文档并使用字符引用,在IE浏览器中查看数据结果。
【描述1.D.4】
创建XML文档并使用实体引用,在IE浏览器中查看数据结果。
【描述1.D.5】
创建XML文档并使用CDATA节,在IE浏览器中查看数据结果。
【描述1.D.6】
创建XML文档并使用处理指令(PI)。
【描述1.D.7】
使用DTD定义有效的XML文档。
1.1 XML概述
XML(eXtensible Markup Language,可扩展标记语言)是一种元标记语言,是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。
1.1.1 XML的历史
XML有两个先驱:SGML和HTML,这两个语言都是非常成功的标记语言,但是都具有一些与生俱来的缺陷。XML正是为了解决它们的不足而诞生的。
1.SGML
早在Web未发明之前,SGML(Standard Generalized Markup Language,标准通用标记语言)就已存在,正如它的名称所言,SGML是国际上定义电子文件结构和内容描述的标准。SGML具有非常复杂的文档结构,主要用于大量高度结构化数据的访问和其他各种工业领域,在分类和索引数据中非常有用。
虽然SGML的功能很强大,但是它不适用于Web数据描述,而且SGML软件的价格非常昂贵;另外,SGML十分庞大,既不容易学,也不容易使用,在计算机上实现也十分困难;不仅如此,几个主要的浏览器厂商都明确拒绝支持SGML,这无疑是SGML在网上传播遇到的最大障碍。鉴于这些因素,Web的发明者——欧洲核子物理研究中心的研究人员根据当时(1989年)的计算机技术,开发了HTML。
2.HTML
1989年HTML诞生,它抛弃了SGML的复杂庞大的缺点,继承了SGML很多优点。HTML最大的特点是简单和跨平台。
HTML是一种界面技术,它只使用了SGML中很少的一部分标记,例如HTML 4.0中只定义了70余种标记。为了便于在计算机上实现,HTML规定的标记是固定的,即HTML语法是不可扩展的。HTML这种固定的语法使它易学易用,在计算机上开发HTML的浏览器也十分容易。正是由于HTML的简单性,使得基于HTML的Web应用得到极大的发展。
3.XML的产生
随着Web应用的不断发展,HTML的局限性也越来越明显地体现了出来,如HTML无法描述数据、可读性差、搜索时间长等。人们又把目光转向SGML,再次改造SGML使之适合现在的网络需求。随着先辈的努力,在1998年2月10日,W3C(World Wide Web Consortium,万维网联盟)公布XML 1.0标准,XML诞生了。
XML最初的设计目的是为了EDI(Electronic Data Interchange,电子数据交换),确切地说是为电子数据交换提供一个统一的标准数据格式。
在EDI应用过程中,XML展现了如下优势。
■ 低成本,XML不需要VAN(Value-Added Network,增值网络)的高额费用,中小企业也负担得起。
■ 定制商业规则,XML允许用户创建自己的商业规则和格式。
■ 容易解释,EDI需要使用翻译软件来得到贸易伙伴的信息格式,而XML通过免费下载的解析器就可以很容易地解释。
■ 平台独立,XML是跨平台的语言,不管是什么平台,都能进行数据交换。
当前的一些内容建设者们已经开始开发各种各样的XML扩展,比如数学标记语言MathML、化学标记语言CML等。此外,一些著名的IT公司,如Oracle、IBM以及微软等都积极地投入人力与财力研发XML相关软件与服务支持,这无疑确定了XML在IT产业的重要地位。
1.1.2 XML的基本特征
XML是一个精简的SGML子集,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能,这使XML从根本上有别于HTML。XML要比HTML强大得多,它不再是固定的标记,而是允许定义不限数量的标记来描述文档中的资料,允许嵌套的信息结构。HTML只是Web显示数据的通用方法,而XML则提供了一个直接处理Web数据的通用方法。
XML具有以下一些特点。
XML可以从HTML中分离数据,即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上去。
■ XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有NN种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。
■ XML可应用于B2B中。例如在网络中交换金融信息,目前XML正成为在遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。
■ 利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单。
■ XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。
■ XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Internet程序的工具,它就采用了XML的标准。
总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重于如何描述将文件显示在浏览器中,而XML与SGML相近,着重于如何将数据以结构化方式表示。就网页显示功能来说,HTML比XML强,但就文件的应用范畴来说,XML比HTML超出很多。XML和HTML在各个方面上的对比如表1-1所示。
表1-1 XML和HTML对比
1.1.3 XML定义
XML是元标记语言,定义了用于定义与其他特定领域有关的、语义的、结构化的标记语言句法的语言。可以从以下几个方面来定义XML。
XML是一种类似于HTML的标记语言。
■ XML是用来描述数据的。
■ XML的标记不是在XML中预定义的,用户可以自定义标记。
■ XML使用文档类型定义(DTD)或者模式(Schema)来描述数据。
下述代码用于实现任务【描述1.D.1】,使用XML描述学生信息,并使用IE浏览器查看数据结果。
【描述1.D.1】 student.xml
<?xml version="1.0" ?> <!-- File Name:student.xml --> <students> <student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student> <student sex = "female"> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student> <student sex = "male"> <name>Jack</name> <age>15</age> </student> </students>
上述代码只能让读者感性地认识XML,并不能实现什么具体应用,它只是用XML标记存储信息的文件。
对于XML文件,可以用IE 5.0或以上版本的浏览器来查看其内容,如果在IE浏览器中打开一个XML文档,它将用颜色显示文档编码的根和子元素,如图1-1所示。
图1-1 用IE浏览器查看XML文件结果
可以单击元素左边的加号(+)或减号(-)来展开或收缩元素的结构,如果想查看原始的XML源文件,就必须从浏览器菜单中选择“查看源文件”(View Source)命令,如果打开的XML文件是错误的,IE浏览器就会报告错误,如图1-2所示。
图1-2 出错时的显示结果
XML是自由的、可以扩展的,XML标记(tag)并不是事先定义好的。在XML中,用户可以根据需要定义自己的标记以及文档结构。比如,上面例子中<students>、<name>、<age>等标记都是这个XML文档的作者创建出来的。而在HTML文档中必须使用HTML规范中定义好的标记,比如<P>、<hr>、<a>、</a>等。
XML可以从HTML中分离数据,即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上去。
1.2 XML文档结构
XML的语法规则既简单又严格,非常容易学习和使用。XML文档使用了自描述的简单语法,如果熟悉HTML,就会发现它的文档和HTML非常相似。
XML文档有两个主要组成部分:序言(prolog)和文档元素(document element,即根元素)。
序言出现在XML文档的顶部,其中包含关于该文档的一些信息,有点儿像HTML文档中的<head>部分。在【描述1.D.1】的XML文档student.xml中,序言包含了一个XML声明。序言也可以包含其他的元素,如注释、处理指令或是DTD(文档类型定义)。
任何XML文档必须有且只有一个文档元素(或称根元素),用来包含可能有的其他内容。XML文档中的所有内容都应该出现在根元素的内部。在遵守XML命名规则的前提下,用户可以为元素和属性选择任何名字(命名应遵循简单易懂的原则)。图1-3显示了XML文档的结构。
图1-3 XML文档的结构
1.2.1 序言
XML序言由两行组成:
<?xml version="1.0" ?> <!—File Name:student.xml-->
其中:
第一行是XML声明,表明这是一个XML文档,并且遵循的是XML 1.0版的规范。
■ 第二行是注释。引入注释可以增强文档的可读性,XML文档的注释是可选的。
XML声明由“<?”开始,以“?>”结束。“<?”就表示该行是一个命令;在“<?”后面紧跟“xml”,表示该文件是一份XML文件(注意必须小写),这是处理指令的名称。在其后可声明XML的版本、采用的字符集等属性;在“<”和“?”之间、“?”和“>”之间,以及第一个“?”和“xml”之间不能有空格。在第二个“?”之前可以没有、也可以有一个或多个空格。
XML声明语句中通常可以有如下属性。
version:该属性是必需的,且必须要小写,用于表明XML的版本,解析器对不同的版本的解析会有区别。
■ encoding:该属性是可选的,用于表明该文档所使用的字符编码方式。XML支持多种字符集类型,例如,使用下面的语句指明文档中的字符编码方式为GB2312编码。
<?xml version="1.0" encoding="GB2312" ?>
standalone:该属性定义了是否可以在不读取任何其他文件的情况下处理该文档,其属性值可以是yes或no,如果XML文档没有引用任何其他文件,则可以指定standalone="yes",否则standalone="no"。standalone的默认值是no。
注意 如果同时设置了encoding和standalone属性,standalone属性要位于encoding属性之后。
对于含有中文字符的XML,可以采用“Unicode”或“GB2312”等支持中文字符的编码来表示,如果文档中的字符使用的是GB2312编码,则必须设置encoding属性值为GB2312。
下述代码用于实现任务【描述1.D.2】,创建含有中文字符的XML文件,并查看数据结果。
【描述1.D.2】 student_gb2312.xml
<?xml version="1.0" encoding="GB2312" ?> <学生花名册> <学生 性别 = "男"> <姓名>汤米</姓名> <年龄>14</年龄> <电话>88889999</电话> </学生> <学生 性别 = "女"> <姓名>罗斯</姓名> <年龄>16</年龄> <电话>66667777</电话> </学生> <学生 性别 = "男"> <姓名>杰克</姓名> <年龄>15</年龄> </学生> </学生花名册>
上述XML代码中,由于存在中文字符,需要在XML声明中引入encoding属性,并设置属性值为“GB2312”,否则将会显示字符编码错误,如图1-4所示。
图1-4 字符编码错误
错误提示的信息是“文本内容中发现无效字符”,这是因为在XML文档声明语句中没有明确指定文档中的字符编码方式,浏览器就会用默认的Unicode编码来解析该文档,而该文档中的字符实际上使用的是GB2312编码,而非Unicode编码。
注意 XML支持多种字符集类型。但一般常用的编码有如下几种:简体中文码(GB2312)、繁体中文码(BIG5)、UTF-8。
另外,序言部分还可以包括下列可选组成部分。
文档类型声明(DTD),它定义了文档的类型和结构。
■ 一个或多个处理指令,它提供了XML处理器传递给应用的信息。
1.2.2 文档元素
XML文档的第二个主要部分是文档元素(根元素)。在XML文档中,元素指出了文档的逻辑结构,并且包含了文档的信息内容(在示例文档中是学生的信息,例如姓名、年龄和电话)。一个典型的元素有起始标签、元素内容和结束标签。元素的内容可以是字符数据、其他(嵌套的)元素或者两者的组合。
整个XML文档就是由标记和字符数据混合成的。标记是用来描述文档结构的定界文本,即元素的起始标签、元素的结束标签、空元素标签、注释、文档类型声明、处理指令、CDATA节定界符、实体引用和字符引用等。
在示例文档中,文档元素是students。其起始标签是<students>,结束标签是</students>,其内容是两个嵌套的student元素,每个student元素同样包括一系列的嵌套元素。
注意 XML文档中的文档元素类似于HTML页中的<BODY>元素,但XML文档元素可以具有任意合法的名称。
1.3 XML文档内容
XML文档必须有一个根元素,用来包含可能有的其他内容。XML文档中的所有内容都应该出现在根元素的内部。在遵守XML命名规则的前提下,用户可以为元素和属性选择任何名字。XML文档内容的主体部分一般由根元素、子元素、属性、注释和内容组成。
XML文档的内容结构如图1-5所示。
图1-5 XML内容结构图
1.3.1 XML元素
元素是XML文档的基本组成部分。它们可以包含其他的元素、字符数据、字符引用、实体引用、PI(Processing Instruction,处理指令)、注释或CDATA部分——这些合在一起被称做元素内容(element content)。所有的XML数据(除了注释、PI和空白)都必须包容在元素中。
XML文档中其他所有元素都是根元素的后代(子元素),student.xml中的根元素是<students>,而<student>、<name>、<age>、<tel>都是它的子元素。
在XML文档中,元素有很多作用,它们可以标记内容;为它们标记的内容提供一些描述;为数据的顺序和相对重要性提供信息;展示数据之间的关系。
XML中元素使用标记进行分隔,标记由一对尖括号(“<>”)围住元素名称(一个字符串)构成。每一个元素都必须由一个起始标记和一个结束标记分隔开。
在XML中,基本上没有什么保留字,可以用任何字符串来作为元素名称,但是XML元素的命名必须遵守下列规范。
元素的名字可以包含字母、数字和其他合法字符,且区分大小写。
■ 元素的名字不能以数字或者标点符号开头。
■ 元素的名字不能以XML(或者xml、Xml、xMl等)开头。
■ 元素的名字不能包含空格,并且避免使用“-”、“.”、“:”等特殊字符。
■ 元素的命名应该遵循简单易读的原则。
■ 如果XML文档与数据表对应,应尽量让XML文档中元素的命名和数据库中字段的命名保持一致,这样可以方便数据变换。
■ 非英文字符、字符串也可以作为XML元素的名字,例如<姓名>、<年龄>等,但为了得到更好的支持,建议使用英文字母来进行命名。
1.起始标记
一个元素开始的分隔符被称做起始标记。起始标记是一个包含在尖括号(“< >”)里的元素名称。可以把起始标记看做是“打开”了一个元素。下面是一些合法的起始标记:<student>,<Student>,<STUDENT>。需要特殊说明的是,元素名称可以使用任何合法字母,而不一定是ASCII码字符。
2.结束标记
一个元素最后的分隔符被称做结束标记。结束标记由一个斜杠(“/”)和元素名称组成,被括在一对尖括号(“< >”)中。每一个结束标记都必须与一个起始标记相匹配,可以把结束标记理解为关闭了一个由起始标记打开的元素。下面是一些合法的结束标记,它们与前面列举的起始标记相对应:</student>,</Student>,</STUDENT>。
带有完整的起始、结束标记的元素应该是如下形式:
<自定义标记>包含的内容</自定义标记>
3.元素分类
XML文档中一共有四类元素:空元素,仅含文本的元素,仅含子元素的元素,含子元素、文本或混合元素的元素。
(1)空元素
如果元素中不包含任何文本或子元素,那么它就是一个空元素。对于空元素,可以只加入起始标记和结束标记而不在其中包含任何内容,如下述代码所示:
<student></student>
空元素的精简表示方式是:由一个元素名称紧跟一个斜杠(“/”)组成,并括在一对尖括号(“< >”)中。下面的代码与上述代码的功能是一致的。
<student/>
(2)仅含文本的元素
有些元素含有文本内容。下述代码中<name>和<age>都是含有文本的元素:
<name>Rose</name> <age>16</age>
(3)仅含子元素的元素
一个元素可以包含其他的元素。容器元素称为父(parent)元素,被包含的元素称为子(child)元素。例如<student>元素就是一个包含子元素的元素:
<student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
(4)混合元素
混合元素既含有文本也含有子元素。下面的代码片段显示了一个混合元素:
<student sex = "male"> 大一四班 <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
4.元素嵌套
XML对元素有一个非常重要的要求——它们必须正确地嵌套。也就是说,如果一个元素(通过起始标签和结束标签来分隔)在另一个元素内部开始,那么也必须在同一个元素内部结束。例如,下列这些元素的是格式良好的:
<student> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
而下列这些元素的格式是不正确的:
<student> <name>Tom <age>14</age> <tel>88889999</tel> </student></name>
当遇到没有被正确使用的嵌套标记时,XML解析器会立刻报告一个“not well-formed(非格式良好的)”错误报告,在IE浏览器中的错误信息如图1-6所示。
图1-6 元素嵌套错误
综上所述,在XML文档中使用元素时应注意以下几点要求。
元素必须含有起始标签和结束标签。
■ 在没有内容(空元素)的情况下,建议使用省略写法。
■ 标签名称必须符合XML命名规则。
■ 元素必须正确地嵌套。
1.3.2 XML属性
XML元素可以拥有属性。属性是对标记进一步的描述和说明,一个标记可以有多个属性。XML中的属性与HTML中的属性是一样的,每个属性都有它自己的名字和数值,属性是标记的一部分。例如:
<student sex = "male"> </student>
XML中的属性也是由用户自己定义的,属性由“名称/值”对组成,其中的值是包含于单引号或双引号中的;一个元素可以有多个属性,它的基本格式为:
<元素名 属性名="属性值">
特定的属性名称在同一个元素标记中只能出现一次;属性值不能包括“<”、“>”、“&”。
例如student元素中可以使用属性表示学生的性别:
<student sex = "male"></student>
也可以这样写:
<student sex = 'male'></student>
上面的两种写法在一般情况下是没有区别的,双引号的写法更普遍一些。
当元素包含属性时,常称为复合类型(complex type)元素,在书写XML模式文档时是常见的应用模式。
在XML中,可以将属性改写为嵌套的子元素。例如,对于下列代码:
<student sex = "female"> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student>
可以改写为:
<student> <sex>female</sex> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student>
上述两种写法都能够正确地描述数据,哪种写法更好并没有一个明确的规则,两种写法都是可接受的。
属性在HTML中可能十分便利,但在XML中,最好避免使用属性。因为使用属性时会引发以下一些问题。
属性不能包含多个值(而子元素可以)。
■ 属性不容易扩展。
■ 属性不能够描述结构(而子元素可以)。
■ 在使用程序代码进行处理时,属性比子元素要难解析。
■ 属性值很难通过DTD进行测试。
■ 使用属性来存储数据,XML文档比较难以阅读和操作。
注意 在XML定义中经常用到属性,但在描述数据时建议尽量使用元素,仅在描述那些与数据关系不大的额外信息时使用属性。
1.3.3 注释
XML中,注释以“<!--”开始,以“-->”结束,除了在XML声明之前,注释可以出现在XML文档的其他任何位置。在进行XML解析时,注释内的任何标记都被忽略,如果希望除去XML文档的一块较大部分,只需用注释标记括住那个部分即可。
XML中,注释的语法如下所示。
<!-- 这里是注释信息 -->
例如:
<!-- File Name:student.xml -->
加入注释通常是为了便于阅读和理解,注释并不影响XML文档的处理。在添加注释时需要遵循以下规则。
注释里不能包含文本“--”。
■ 注释不能包含于标记内部。
■ 元素中的开始标签或结束标签不能被单独注释掉。
1.3.4 字符引用和实体引用
与SGML和HTML一样,XML为显示非ASCII码字符集中的字符提供了两种方法:字符引用和实体引用。
1.字符引用
实际处理过程中,不在键盘上的字符或是图形字符是无法直接输入的,这种情况下,可以使用Unicode码将它们以字符引用的形式加入。比如,可以将版权符号“©”编码成“©”。以“&#”开始并以“;”结束的引用都是字符引用。中间的数字是所需字符的Unicode编码,如果编码写成十六进制形式,应该使用一个“x”作为前缀,比如“©”也可表示为“©”。下述代码是两个示例:
&#AAAAA; &#XXXXX;
上面的字符串“AAAAA”和“XXXXX”可能是一个或多个数字,对应着任何XML允许的Unicode字符值,可以是十进制数字或十六进制数字。
下述代码用于实现任务【描述1.D.3】,演示了如何使用字符引用。
【描述1.D.3】 chars.xml
<?xml version="1.0" ?> <chars> <ch>©</ch> <ch>©</ch> <ch>®</ch> <ch>®</ch> </chars>
通过IE浏览器查看结果如图1-7所示。
图1-7 字符引用演示
2.实体引用
实体引用允许在元素内容或属性值中插入任何字符串,这就为字符引用提供了一种助记的替代方式。实体引用方式是在一个合法的XML名字前面加上一个“&”符号,后面加上一个分号“;”,如下所示:
&name;
有五个实体被定义为XML的固有部分,它们通常作为XML标记分隔符号的转义序列,如表1-2所示。
表1-2 XML的转义字符
下述代码用于实现任务【描述1.D.4】,演示了如何使用实体引用。
【描述1.D.4】 chars2.xml
<?xml version="1.0" ?> <chars> <ch><</ch> <ch>></ch> <ch>&</ch> <ch>"</ch> <ch>'</ch> </chars>
通过IE浏览器查看结果,如图1-8所示。
图1-8 实体引用演示
1.3.5 CDATA节
一般情况下,为了能在元素内容的字符数据中插入特殊字符(如<、>、&等),可使用字符引用或者一个预定义的通用实体引用。但如果存在大量的特殊字符,使用这种方式就很笨拙而且使数据难以阅读。在这种情况下,可以将包含限制字符的文本放在CDATA节中。
CDATA节以“<![CDATA[”开始,并以“]]>”结束。在这两个限定字符组之间,可以输入除了“]]>”之外(因为它会被解释为CDATA节的结束)的任意字符。CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标记。
下述代码用于实现任务【描述1.D.5】,演示了CDATA节的使用。
【描述1.D.5】 CDATA.xml
<?xml version="1.0" encoding="GB2312"?>
<files>
<file>
<name>special.txt</name>
<!--使用CDATA节可以输入除]]外的任何字符 -->
<content><![CDATA[some special charactor " ' < > & ]]></content>
</file>
<file>
<name>special.txt</name>
<!--不使用CDATA节需要使用字符引用或实体引用来输入特殊字符 -->
<content>some special charactor " ' < > & </content>
</file>
</files>
通过IE浏览器查看结果如图1-9所示。
图1-9 CDATA演示
在使用CDATA节时,应注意以下几个细节。
CDATA节可以在任何出现字符数据的地方使用,但不能出现在XML标记中。
■ CDATA节必须包含在元素中。
■ CDATA节之间不能再包含CDATA节(不能嵌套)。
如下示例是格式不正确的。
<?xml version="1.0" encoding="GB2312"?> <files> <file> <!--包含在标记中 --> <name <![CDATA[some description]]>>special.txt</name> <!--CDATA嵌套 --> <content><![CDATA[outer <![CDATA[inner]]> ]]></content> </file> </files>
1.3.6 处理指令
XML并不预先假设元素或者其内容的处理办法,这是XML的优势之处。在实际开发过程中,经常需要把某些信息通过文档传递给应用程序,处理指令(Processing Instruction,PI)正是XML为此目的提供的一种机制。
处理指令的语法形式如下:
<? target instruction ?>
具体介绍如下。
target:指令所指向的应用的名称,是必需的部分,而且必须是有效的XML名称。
■ instruction:一个字符串表示,它可能包含任何有效的字符(除了“?>”)。
可以把处理指令插入到XML文档中除其他标记之外的任何地方,也就是说,可以把它插入到与插入注释相同的地方:在文档的序言中、在文档元素的后面或者在元素的内容中。一个几乎随处可见的PI的用途就是将一个样式单和XML数据对象关联起来:
<?xml-stylesheet ...?>
下述代码用于实现任务【描述1.D.6】,演示了处理指令的使用。
【描述1.D.6】 PI.xml
<?xml version="1.0" encoding="GB2312"?> <!-- 序言中的处理指令 --> <?xml-stylesheet type="text/css" href="student.css" ?> <students> <!-- 元素内部的处理指令 --> <?ScriptA level="A" ?> <student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student> <student sex = 'female'> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student> </students>
该XML文档关联了一个student.css文件,用于设置XML文档中元素的样式。代码如下所示。
【描述1.D.6】 student.css
student{ display:block; margin-top:12pt; font-size:10pt } name{ font-style:italic; font-size:20pt } age{ font-weight:bold } tel{ font-size:20pt }
通过IE浏览器查看结果如图1-10所示。
图1-10 处理指令演示
在XML中使用PI有如下好处。
可以作为脚本或服务端包含文件的挂钩(避免类似HTML语法中“<!-- -->”注释语法的泛滥成灾)。
■ 可以作为扩展模式的机制(否则它们就不能被修改)。
■ 它是一种无须改变DTD认证就可以扩展文档的方法。
■ 在不影响文档结构的情况下,通过在XML文件中嵌入处理指令,将信息以文档的形式传递给应用程序。
注意 处理指令不能放入XML标记中声明。
1.4 XML文档规则
XML语法虽然简单,但要遵循“良好格式”的规则才能编写合法的XML应用。
1.4.1 格式良好的XML文档规则
1.必须有声明语句
XML声明是XML文档的第一句,其格式如下:
<?xml version="1.0" standalone="yes/no" encoding="UTF-8"?>
XML声明的作用是告诉浏览器或者其他处理程序:这个文档是XML文档。
2.注意大小写
在XML文档中,大小写是有区别的。“<P>”和“<p>”是不同的标记。注意在写元素时,前后标记大小写要保持一致。例如:<Author>TOM</Author>,写成<Author>TOM</author>是错误的。
最好养成一种习惯,在输入标记时或者全部大写,或者全部小写,或者第一个字母大写,这样可以减少因为大小写不匹配而产生的文档错误。
3.XML文档有且只有一个根元素
良好格式的XML文档必须有一个根元素,也就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在其他所有元素的起始标记之前;根元素的结束标记要放在其他所有元素的结束标记之后。
4.属性值使用引号
在HTML代码里面,属性值加不加引号都可以。例如:“<font color=red>word</font>”和“<font color="red">word</font>”都可以被浏览器正确解释。但是XML中规定所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
5.所有的标记必须有相应的结束标记
在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个起始标记,就必须有一个结束标记,否则将被视为错误。
6.所有的空标记也必须被关闭
空标记就是标记对之间没有内容的标记。比如“<img>”等标记。在XML中,规定所有的标记必须有结束标记。
7.标记必须正确嵌套
标记之间不得交叉。在HTML文件中,可以这样写:
<B><H>Today is Saturday.</B></H>
<B>和<H>标记之间有相互重叠的区域,而在XML中是严格禁止这样标记交错的写法,标记必须以规则性的次序出现。
8.处理特殊字符
在XML文档中,如果要用到特殊字符,必须用相应符号代替,如“<”已作为标签使用,不能出现在XML文档中,应以相应的实体引用代替。
对于空白字符,XML的处理方式和HTML不一样。HTML标准规定,不管有多少个空格,都当做一个空格来处理。例如在HTML中,“Today is Saturday.”将会被显示成“Today is Saturday.”,HTML解析器会自动把句子中多余的空格部分去掉。
而在XML中规定,所有标记以外的空格,解析器都要全部交给应用程序处理,即解析器会保留内容中所有的空格字符并不加修改地传递给应用程序。
1.4.2 格式良好的XML文档
一个遵守XML语法规则,并遵守XML规范的文档称之为格式良好的XML(Well-formed XML)。XML必须是格式良好的,才能够被解析器正确地解析出来。一个格式良好的XML文档需满足下列条件。
语法合乎XML规范。
■ 元素构成一个层次树,只有一个根结点。
■ 除非提供了DTD,否则没有对外部实体的引用。
1.4.3 有效的XML文档
在XML文档中,用的大多都是自定义的标记。但是如果两个同行业的公司A和B要用XML文档相互交换数据的话,他们之间必须有一个约定——即可以用哪些标记,父元素中能够包括哪些子元素,各个元素出现的顺序,元素中的属性怎样定义等,这样双方在用XML交换数据时才能够畅通无阻。这种约定规则可以用DTD(Document Type Definition,文档格式定义)或XML Schema(XML模式)来表述。
注意 XML Schema是基于XML的DTD的替代品,W3C使得DTD和Schema可以相互替代。关于DTD和Schema,将在后续章节详细介绍。
一个有效的XML文档首先应该是一个格式良好的XML文档,其次还必须符合DTD或是XML模式所定义的规则。所以说格式良好的XML文档不一定是有效的XML文档,但有效的XML文档一定是格式良好的XML文档。
下述代码用于实现任务【描述1.D.7】,基于DTD,演示有效XML文档的定义。
【描述1.D.7】 product.dtd
<?xml version="1.0" encoding="GB2312"?> <!ELEMENT PRODUCTS (PRODUCT)+> <!ELEMENT PRODUCT (PRODUCTNAME,DESCRIPTION,PRICE,QUANTITY)> <!ELEMENT PRODUCTNAME (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ELEMENT PRICE (#PCDATA)> <!ELEMENT QUANTITY (#PCDATA)> <!ATTLIST PRODUCT PRODUCTID ID #REQUIRED CATEGORY (BOOKS|TOYS) "TOYS">
下面的XML是一个应用上述DTD文档的有效的XML文档。
【描述1.D.7】 product.xml
<?xml version="1.0" encoding="GB2312"?> <!DOCTYPE PRODUCTDATA SYSTEM "product.dtd"> <PRODUCTS> <PRODUCT PRODUCTID="P001" CATEGORY="TOYS"> <PRODUCTNAME>乱世佳人</PRODUCTNAME> <DESCRIPTION>以美国内战为背景进行叙事</DESCRIPTION> <PRICE>26.80</PRICE> <QUANTITY>60</QUANTITY> </PRODUCT> </PRODUCTS>
通过IE浏览器查看结果如图1-11所示。
图1-11 DTD演示
DTD定义了XML文档中可用的合法元素。它通过定义一系列合法的元素决定了XML文档的内部结构。
小结
通过本章的学习,学生应该能够学会:
XML是一种类似于HTML的标记语言,是一种元标记语言。
■ XML是用来描述数据的,不是HTML的替代品。
■ XML的标记不是在XML中预定义的,用户可以自定义标记。
■ XML有两个先驱:SGML和HTML,XML正是为了解决它们的不足而诞生的,XML是一个精简的SGML子集。
■ XML文档有两个主要组成部分:序言和根元素。
■ XML文档内容的主体部分一般由根元素、子元素、属性、注释和内容组成。
■ 元素是XML文档的基本组成部分。它们可以包含其他的元素、字符数据、字符引用、实体引用、PI、注释或CDATA部分。
■ 字符引用和实体引用是XML处理特殊字符的两种方式。
■ 引入CDATA节可以描述除了“]]>”之外的任意字符串。
■ 处理指令可以把某些信息以文档的形式传递给应用程序。
■ XML必须是格式良好的,才能够被解析器正确地解析。
■ 一个有效的XML文档应该既是格式良好的,同时还必须是符合DTD或是XML Schema所定义规则的XML文档。
练习
1.属性______用来表示XML文档所使用的字符集。
A.version B.encoding C.standalone D.language
2.含有简体中文字符的XML文档中,encoding属性值可设为______。(多选)
A.UTF-8 B.BIG5 C.GB2312 D.ISO-8859-1
3.实体引用前面带有一个符号______。
A.& B.# C.+ D.;
4.下述关于XML文档的描述正确的是______。(多选)
A.XML不区分大小写
B.任何XML文档有且只有一个根元素
C.XML中的标记可以没有结束标记
D.在合适的位置,引入CDATA节可以描述除了“]]>”之外的任意字符串
5.每个XML文档都分为两个部分:______和______;
<?xml version="1.0" encoding="gb2312"?>是一个______。
6.XML中一共有四类元素,分别是______、______、______和______。
7.XML文档内容的主体部分,一般由_______、_______、_______、注释和内容组成。
8.XML是从______扩展来的。
9.使用XML的优点是什么?
10.相对于EDI的结构化信息技术而言,XML的优势有哪些?
11.简要描述XML的命名规范。
12.简要描述格式良好的XML文档应遵循的规则。