声明:《本文是j2ee1.4 tutorial的中文翻译,由于本人水平有限,其中还包含有很多的错误,还希望各位大虾帮助改正,翻译正在进行中,我会陆续发表最新的部分,望大家能给与支持!》
理解XML这一章描述了扩展标记语言(Extensible Markup Language -- XML)和相关的规范。为了您能更易理解XML语法,下文中会包含一些编写XML的实践。
注意:本章中的所有XML文件都可以在下面的目录中找到
<INSTALL>/j2eetutorial14/examples/xml/samples.
关于XML的介绍
本章的内容覆盖了XML的基础。本章的目标是让您在开始学习XML之前,掌握更多的信息,以便您能更好的理解XML。本章会概括XML的主要特征(如:利于信息存储和信息转换),让您认识到XML是怎样被使用的。
什么是XML
XML是一个基于文本的标记语言,它在Web上很快的成为数据交换的标准。像Html语言一样,你通过使用标签来识别数据(识别符被包含在尖括弧里,如:<。。。>)。总的来说,标签被认为是“标记”
但是,与HTML标签不同的是,XML标签是用来识别数据,而不是用来显示数据的。比如:HTML用粗体来显示数据的标签是<b>。。。</b>,但XML会将上面的标签认为是一个字段名,XML的标签的含义是:标记一段数据,以便以后可以通过这个标记来识别这段数据(例如:<message>。。。</message>)。
注意: “识别数据”让你对XML有一个感性的认识, XML 有时候被描绘成为一种指定数据含义的机制。
用同样的方法你为一段数据结构定义了字段名, 而你可以随意的使用任何的XML标记。虽然,同样的XML数据会用在各种各样的应用程序中,但人们对在这段数据上将要使用的XML标记名称会自然的取得一致。
下面是一个用在通讯应用程序中的XML事例:
<message>
<to>you@yourAddress.com</to>
<from>me@myAddress.com</from>
<subject>XML Is Really Cool</subject>
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
注意: 在指南中, 我们使用加粗的字体来引起你的注意。而实际编写XML不需要加粗字体!
在上面的例子中的message标记从总体上识别信息(目的地址,发信人地址,主题,内容)。和HTML语言一样,<to>标记拥有一个匹配的结束标记</to>。在开始标记和结束标记之间的数据定义了XML数据元素。注意:<to>标记和对应的</to>标记要完全的包含在<message>。。。<message>标记范围之内。这种包含关系使XML能更好的表现层次数据结构。
同HTML一样,XML中的空格是不起作用的,这样你可以用易读的方式来格式化数据,而格式化后的数据仍能够被程序正确的处理。与HTML不同的是,在XML里,你可以简单的查找主题中是否包含“cool”这个单词,因为XML标记是识别数据内容,而不是指定显示格式。
标签和属性
标记也可以包含属性?包含在标记内部的信息(尖括号中),下面的例子例举了一个email信息结构,其中将“to”,“from”,“subject”字段变成了属性:
<message to="you@yourAddress.com" from="me@myAddress.com"
subject="XML Is Really Cool">
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
在HTML中,属性名称后紧跟着“=”号和属性值,各种各样的属性被空格隔开。与HTML不同的是, 在XML中,在属性之间的“,”是不能被忽略的(如果存在,会产生错误)。
既然你能够使用属性或标记设计一个数据结构,而且这两个结构是等价的。那么我们就会思考,到底使用那个方案更好的适应我们的应用。Designing an XML Data StrUCture ,这个连接的内容会帮助你决定什么时候使用属性,什么时候使用标记。
空标记
HTML和XML之间一个最大的不同是:一个XML文档总是被强制要求是格式良好的。有几种规则来决定一个文档是否是格式良好的。其中最重要的一条就是:每一个标记都要有一个结束标记。所以,在XML中,</to>标记是不可以省略的。<to>标记除了被</to>标记结束以外是不能被其他任何标记结束的。
注意:另一个格式良好文档的重要的要素是所有的标记必须完全的嵌套。所以你可以写<message>..<to>..</to>..</message>, 但是不能写 <message>..<to>..</message>..</to>。 一个格式良好条件的XML Frequently Asked Questions (FAQ)列表在 http://www.ucc.ie/xml/#FAQ-VALIDWF. (这个常见问题解答是在w3c "Recommended Reading" 列表中,位于 http://www.w3.org/XML/.)
可是,有些时候,一个标记独自存在也是可以被理解的。例如,你可能像增加一个“flag”标记,用这个标记来标识信息的重要性。这样的一个标记不包含任何的内容,所以它被称作“空标记”。你可以通过用/>代替>来产生这个空标记的。例如,下面的信息就包含这样的标记:
<message to="you@yourAddress.com" from="me@myAddress.com"
subject="XML Is Really Cool">
<flag/>
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
注意: 这个空标记使你不用为了格式良好性而不得不写成<flag></flag>。你可以通过产生一个文档类型定义DTD(Document Type Definition)来控制那个标记可以被置程空标记。我们将在后面讨论DTD。如果没有DTD,那么文档中可以包含任意种类的格式良好的标记 。
XML文件中的注释
XML的注释很像HTML的注释:
<message to="you@yourAddress.com" from="me@myAddress.com"
subject="XML Is Really Cool">
<!-- This is a comment -->
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
XML的序(prolog)
为了完成对XML的入门,一定要注意一个XML文件总是开始于一个序。最小的序包含一个声明,这个声明标识一个文档为XML文档。如:
<?xml version="1.0"?>
这个声明可能包含额外的信息,比如:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
这个XML声明重要性如同HTML的头--<html>,区别在于XML使用<?…?>,并且在其中可以包含如下属性:
version
识别XML标识语言的版本。这个属性是可选的。
encoding
识别数据的编码格式。“ISO-8859-1”是西欧和英文字符集(默认格式为UTF-8)。
standalone
标识本文档是否引用一个外部的实体或一个外部的数据类型规范。如果没有外部的引用,那么设置成“yes”是合适的。
在序中也可以包含实体定义(当你在文档中引用它时,它才会被插入)和规范(告诉你在文档中使用那些标识是合法的)。这些在DTD中声明的实体定义和规范可以直接在序中被定义,也可以在序中定义一个外部规范文件的指向,以上这些将是后面的主题。要了解更多这方面的信息,可以查看列举在w3cXML页面的推荐读物(the Recommentded Reading)列表http://www.w3.org/XML/。
注意: 有些声明是可选的。但是当你编写一个XML文件时,包含这个声明是明智的。这个声明至少要包含一个版本号,加上编码格式会更好一些。无论XML标准在将来被扩展还是这些数据将会本地化,这样做会简化你很多的工作。
在XML序后面的所有内容组成了文档的内容。
处理指令
一个XML文件也能够包含处理指令,这些处理指令为处理这个XML文件的应用程序提供了命令和信息。处理指令拥有如下的格式:
<?target instructions?>
上面的target是处理本XML文件的应用程序名称,instructions是一个包含应用程序需要的信息和命令字符串。
因为instructions是针对应用程序的,一个XML文件可以拥有多个针对不同的应用程序处理指令使不同的应用程序做相似的事情。
注意: 目标程序名(target)“xml”(或三个字母的大小写组合)被XML标准所保留。
为什么XML是重要的
有很多的原因使XML很快被接受。这部分例举了一些优点。
纯文本
因为XML不是二进制格式的,所以你可以使用一个标准的文本编辑器或一个可视的开发环境来编写XML文件。这是得你可以很简单的调试你的程序和使用它存储商量的数据。在其他的领域,一个基于数据库的XML前端使存储大量的XML数据成为可能。所以XML提供了小到一个配置文件,大到公司的数据库存储的能力。
数据识别
XML使你知道你拥有什么种类的数据而不是告诉你怎样去显示这些数据。因为标记识别信息,将数据分成了各个部分。一个email程序可以处理它,一个搜索程序可以搜索发送给某人的信息,一个地址簿可以从剩下的信息里选出地址。简单地说,因为不同部分的信息有不同的标识,所以,他们能被不同的应用程序用于不同的目的。
表现能力
当显示变得重要时,样式表标准(stylesheet standard, XSL)允许你指示怎样去描绘数据。例如,针对下面语句的样式表:
<to>you@yourAddress.com</to>
能够表示成:
1. 开始新的一行。
2. 以粗体显示“To:”并且在后面加一个空格。
3. 显示目标数据。
作用的结果是:
To: you@yourAddress
当然,你能够在HTML里做同样的事情,但是你不能用查找程序和地址解析程序等处理这些数据。更重要的是,因为XML是样式自由的,所以你能够使用不同的样式表产生不同的显示结果。你今天编写的XML文档能被将来的系统所使用。
内嵌的可重用能力
XML文档的最优秀的部分之一是他们能够被分开的实体所组成。你能够用HTML做同样的事,但是只能连接到其他的文档。与HTML不同的事,XML实体能够内嵌到文档中。内嵌的部分就像文档的其它部分,你可以同时搜索整个文档或者在以一个块的方式下载它。这可以让你模块化你的文档而不用凭借连接。你能够单一化资源,这样对一个部分的编辑可以反射到这部分使用到的各个部分。然而,每个人都会把一个由这些片断组成的文档当成一个片断的文档。
连接能力
很感谢HTML,在文档之间定义连接的能力现在被认为是不可缺少的。本指南的下一部分,XML and Related Specs: Digesting the Alphabet Soup,讨论了连接规范初步。这个初步使你能够定义双向连接:多目标连接、展开连接(点击一个连接使目标信息内嵌显示)和两文档之间的连接。
处理简单
像以前提及的初期的、规则的和一致的符号使建立应用程序来处理XML数据变得简单。例如,在HTML里,一个<dt>标签能够被</dt>、另一个<dt>或</dl>结束。这是的针对它的编程很困难。但是在XML中,<dt>标记必须被</dt>结束,这个限制是XML文档具有格式良好的前提。(否则,XML解析器无法读取数据)。既然XML是一个厂商中立标准,所以你可以在众多的XML解析器中选择。
层次
最后,XML文档受益于层次结构。一般的,层次结构文档可以很快被访问,因为你能够直达你需要的部分,像进入一个内容表。它们也更容易整理,因为每一个片断被限定了。例如在文档里,你能移动一个标题到一个新的位置,也能够拖动标题中的所有内容。这样就代替了选择一部分内容在粘贴到另一个地方。
怎样使用XML
有几个地方可以使用XML:
1. 传统的数据处理,其中XML将数据编码让程序来处理。
2. 文档驱动程序,XML文档作为编译接口和应用程序的容器
3. 存档 ?文档驱动程序的基础,你可以制定一个被保存的组件的版本,这样这个组件可以再次被使用。
4. 绑定,定义数据结构的DTD或概要(schema)通常被用来产生一个应用程序的重要的部分。
传统数据处理
XML快速的成为在Web上显示数据的选择。当XML被使用在以网络为中心的Java平台程序(用来发送和接收信息)上时,它是最优秀的。所以,一个客户端/服务器应用程序能够使用编码过的XML来交换数据。
在将来,XML将是在各种各样事务中进行数据交换的最好语言(要求双方的语言选择达成一致)。再过几年,对通用标准的需求将产生许多的产业标准。在这几年间,将你现在的产品转换到基于XML的产品的机制将是非常重要的。这些机制包括RDF 初步(用来定义“元标记”) 和XSL 规范(使你转换一类XML标记到其他类XML标记)。
文档驱动编程
最新的使用XML的方法是构造一个文档,用这个文档来描述一个应用程序页面应该怎样显示。这个文档(并不是被简单的显示)由对使用者界面组件的引用和商业逻辑组件的引用组成。
当然,你一定会感觉利用Java平台编写这些组件会更好些。无论是Java Beans组件还是Enterprise Java Beans组件都能够被用来构造这样的应用程序。尽管迄今为止没有什么成果为商业使用做准备,但是一些初步的工作已经完成。
注意:用Java编程语言编写XML处理工具也是很好的选择,因为它和XML一样都是平台无关的。几个针对Java平台的可视的XML编辑器已经开发完成。你可以在下面的地址里查看编辑器、处理工具和其他XML资源列表: http://www.oasis-open.org/cover/.
绑定
一旦你使用DTD或概要(schema)定义了XML数据的结构,那么你需要做的大部分处理就会被定义。例如,如果概要声明在一个<date>元素中的文本数据必须是合法的日期格式,那么这个数据的合法性就被定义,而剩下的工作就是写代码。尽管一个DTD规范不能达到同样的细节,但是一个DTD提供一个语法,此语法告诉你哪一个数据结构会发生,按什么样的顺序发生。这个规范告诉你怎样写处理数据元素的高级别的代码。
但是当数据结构被完全的制定,你需要编写的处理代码能够被简单的自动生成。像这样的处理被称作绑定(通过处理定义元素的规范来产生处理元素的类)。随着时间的推移,你会发现你正在使用数据规范来产生重要的代码,这样你就能够将注意力集中到应用程序的编写上。
归档
Holy Grail设计是可重用的、模块化组件的构造。理想情况下,你把他们从书架上拿下来,定制他们和组合他们来构建一个应用程序,你只需要编写很少的代码和额外的编译工作。
保存信息的基本的机制被称为归档。你通过将一个组件写到一个输出流来存档它。然后你可以将它读进来并使用它保存的参数实例化它。例如,如果你保存一个表组件,它的参数可能是用来显示的行和列的数目。归档组件也可以以不同的方式使用。
当组件以二进制方式归档的时候,如果你在保留这个归档的兼容性的前提下改变类文件,那么你将会遇到一些限制。如果你能够修改归档版本来表现一些改变,那么能够解决一些问题。但是改变二进制是很困难的。这些问题是我们开始做使用XML进行归档的尝试。但是如果一个对象的状态以文档格式被归档,那么我们就很容易改变它。
XML的基于文档的格式也能够使在用不同的语言编写的应用程序间传递对象更加简单。基于这些理由,基于XML的归档方式在不远的将来可能会成为重要的力量。
总结
XML是如此的简单和灵活。到现在为止,仍然有很多的应用在开发中。它是很多即将到来标准的基础,它提供一种通用的语言使不同的计算机系统间可以实现数据交换。
更多的信息关于XML背景可以从下面的连接得到:
http://www.sciam.com/1999/0599issue/0599bosak.html
(出处:http://www.knowsky.com)