目录 |
XML是由互联网联盟(World Wide Web Consortium,W3C)的XML工作组定义的。这个工作组是这样描述该语言的:
“扩展标记语言(XML)是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务、接收和处理。XML被设计成易于实现,且可在SGML和HTML之间互相操作。”
XML是一种专门在World Wide Web(www)上传递信息的语言,就像HTML(超文本标记语言)一样(自从Web出现以来,HTML已经成为了创建Web页的标准语言)。
简单地说,无类型XML是指XML文档没有和任何XML模式相关联。
如果不确定XML将遵循哪个XML模式,则无类型XML有用。例如,如果必须使用一个应用程序的某些XML,但无法确定数据将遵循哪个XML,则可以使用无类型XML列来执行这项工作。当然,无类型XML也会带来其他问题。例如,不能针对某个模式编程,因此很难有效地使用XML。
模式不绑定到XML列,SQL Server 2005会将无类型XML作为一个字符串存储。这既是好事也可能是坏事。一方面,将XML作为字符串存储可以更灵活地存储任何XML片段或文档。另一方面,将XML作为字符串存储意味着,与类型化XML相比,既不能有效地存储也不能有效地搜索XML数据。
与无类型XML相对应,类型化XML文档可以绑定到某个XML模式。例如,一个XML列绑定到XML模式后,再对此列操作时,XML模式会自动验证XML数据是否符合XML模式的要求。在SQLServer2005中,可将多个模式集合在一起形成模式集合。
使用XML模式有两个优点:
(1)XML验证是自动的。无论是给一个变量分配XML值,还是向XML列中插入XML值,SQL Server都会自动用模式来验证XML的有效性。这样做的结果是获得了较好的性能,因为不用在运行时转换节点的值。
(2)XML存储的内容是最少的,因为关于元素和属性的类型信息都由模式本身来提供。这样做可以为存储值提供更好的转换解释。
由于以上优点,XML必将在商务的自动化处理、信息发布、智能化豹Web应用程序和数据集成等领域被广泛使用。
数据标记的需求起源于电子数据格式化。早期的电子数据格式化主要关注的是数据应该如何被显示而不是数据的文档结构和含义。Troff(UNIX下的文档资料排版、编辑和格式化程序)和TEX(一种电子排版系统)就是两种早期的格式化语言,在格式化打印文档方面取得了很多成果,但是缺少任何关于结构方面的功能。因此这些文档只局限于屏幕显示和硬拷贝打印。人们难以编写一个程序对这些文档中的信息进行查找、提取和前后对照,更不能方便地将一个文档中的数据重复用于不同的应用中。
通用编码(Generic Coding)使用描述性标签取代格式码,最终解决上述问题。最早认真研究该问题的是图形通信协会(Graphic Communications Association,GCA)。在20世纪60年代末,图形通信协会(GCA)的Gen Code委员会研发出一种使用通用标签(Generic Tag)将不同类型的文档装配成由多个部分组成的复合型文档的方法。
在此之后,在该方面取得主要进展的是IBM公司的一个研发项目:广义标记语言(Generalized Markup Language,GML)。由Charles Goldfarb、Edward Mosher和Raymond Lorie三人主持的GML项目旨在提供一个能够在多重信息子系统中使用的文档编码解决方案。因为采用基于内容的标签,由GML编写的文档能够被编辑、格式化以及能够使用不同的程序进行检索。作为一个巨大的技术手册发布者,IBM已经广泛采用了GML,并以此证明了通用编码的生命力。
基于GML的成功,美国国家标准协会(American National Standards Institute,ANSI)在信息处理方向上建立了一个由Charles Goldfarb领导的项目小组,以研发一个基于GML的文本描述语言标准为目的。GCA的Gen Code委员会也为此项目贡献了力量。自20世纪70年代后期到80年代早期,该委员会发布了工作草案并最终提交了一个工业标准的候选方案(GCA 101-1983),该候选方案被称为广义标记语言标准(the Standard Generalized MarkupLanguage,SGML)。该标准很快就被美国国防部(the U.S. Department of Defense)和美国国内税局(the U.S. Internal Revenue Service)采用。
在随后的几年里,SGML得到了世界上更多国家的认可。自1985年以来,世界上的SGML用户群体开始在英国集会。他们协同GCA一起将SGML在欧洲和北美进行推广,将SGML拓展到更广阔的领域。美国出版协会(the Association of American Publishers,AAP)的电子手稿项目(the Electronic Manuscript Project)将SGML标准应用于编制通用文档,如书籍和期刊等。美国国防部为其计算机辅助采集和后勤支持(Computer-Aided Acquisition and Logistic Support,CALS)小组开发基于SGML的应用程序,其中包括一种流行的表格格式文档类型称为CALS表格。鉴于SGML的成功,国际标准化组织(the International Standards Organization,ISO)采纳了SGML标准(ISO 8879:1986)。
SGML被设计为一种灵活的,且无所不包的编码方案。和XML一样,SGML基本上是一个为开发专用化标记语言的工具箱。但是SGML比起XML来大得多,它具有更加灵活的语法以及更多的深奥参数。SGML过于灵活了,以至于开发一个能处理SGML的程序过于复杂和昂贵,只有那些能够承担得起软件开发以及SGML环境维护所需开销的大型机构才能获得SGML带来的好处。
在20世纪90年代早期,由欧洲粒子物理研究所的雇员Tim Berners-Lee和Anders Berglund发布了超文本标记语言,将通用编码革命性地引入到了公共大众的视野中。CERN早在1980开始致力于对SGML的研究和推广,当时就由Anders Berglund开发出一种出版系统用来测试SGML。随后Tim Berners-Lee和Anders Berglund提出一种支持超级文本的SGML文档,这种文档比SGML文档精简和有效。为该超级文本标记语言编写相应软件更为容易,且更容易对文档进行编码。据此,HTMI。得以由实验室应用迅速推广到全世界。HTML的出现极大地推动了世界范围内的互联网的发展,万维网就是一个主要成果。
然而,HTML在某些方面是一种通用编码的倒退。第一,HTML为了获得精简编码方式的有效性,而抛弃了通用编码的一些基本原则。例如,通用编码要求一个文档类型能用于任何目的,要求用户编码时应重载标签而不是重新定义特殊目的的标签。第二,HTML中的很多标签是纯粹追求显示效果的,这显然与通用编码的初衷相违背。这种简化的结构很难区分文档的开始部分和结束部分。如今采用HTML编码的文档非常依赖纯格式化以致不能被用作其他目的。虽然HTML有着诸多的问题,但是我们不能抹杀它在标记语言的发展过程中为Web的发展带来飞跃所起到的重要作用。至少,HTML使得全世界的人对电子文档化和资源链接充满了兴趣。
为了回归到理想的通用编码状态,一些人试着改变SGML以适应Web,或者干脆改变Web以适应SGML,不幸的是,这被证实是非常困难的。SGML是如此的巨大,不可能被塞进小小的Web浏览器中。所以采用一种更小的,却又能保持SGML通用性的语言是唯一可行的途径,由此,令人兴奋不已的可扩展标记语言诞生了。
由于不满于现存信息格式化应用形式,在20世纪90年代中期,由一些公司和组织共同组建的互联网联盟开始致力于创造一种融合SGML灵活性和HTML简单性的标记语言。该组织创建XML的基本原则可以被具体化为以下6个重要原则。
标记语言必须非常适合相应的数据。不应创造单一和通用的语言以覆盖所有的文档类型,应允许存在很多语言,而每种语言都能很好地适应它所面向的数据。用户能够自行选择元素名称以及决定它们应该在文档中如何组织。这将带来更好的标识数据、更丰富的格式化形式以及增强数据检索的能力。
一个文档应该有且仅有一种途径解释名称、顺序以及元素的层次关系。下面是一段旧格式的HTML代码:
<html>
<body>
<p>这是一个段落
<p这是另一个段落>
</body>
<html>
在XML出现之前,以上代码中的标记方式是可以被接受的。每个浏览器都知道一个<p>标签的开始表示一个开放的P元素跟在其后面,同时该元素的结束也表示一个新的P元素的开始。这种标记语言所具有的预判能力是XML不包含的,因为这将允许无穷无尽的元素出现,导致可能出现二义性的情况。接下来再看看下面两行代码,第一个元素到底是包含后面那个元素,还是和它邻接呢?
<flooby>这是一个元素
<flooby>这是另一个元素
这个问题不管是用户还是解释器都无法知道。只能去猜,但是可能会猜错。这就是为什么XML对于语法规则要求的如此严格的原因。具有严格的语法规则将使得文档中的错误标记能够更明显地暴露出来,从而减少最终错误的数量。另外也能减少相关软件的复杂度,因为在软件设计中不必加入逻辑推理或修正语法错误的部分。XML的严格语法也许会使用户在编写XML文档时花费很多精力来考虑细节问题,但是考虑到编制好的XML文档的健壮性,花费这点精力还是值得的。
为了保证文档具有最大的输出格式灵活性,必须尽力保持样式信息处于资料文档之外,并外部存储。一个依赖样式标记的文档是难以重用或被转换为新样式的。例如,在一个文档中,对于包含的外来短语使用斜体标记,而需要重点强调的短语也用斜体标记,代码如下:
<example>歌德曾说过,<i>Leben ist wie Sauerkraut</i>。我<i>非常<i>赞同这个观点。
</example>
现在对这段信息的样式进行修改,将需强调的短语由原来的斜体样式修改为加粗样式,而保持外来短语的斜体样式,用户将不得不人工使用加粗样式标记替换强调短语原有的那些斜体样式标记。上述代码中,由于只有一个强调短语,比较容易替换。但是可以想象一下,如果一个文档有成百上千个这样的强调短语,而且还要判断哪些是外来短语,哪些是强调短语,工作量可想而知。解决类似这种问题最好的办法是,基于需标记信息的含义进行标记,代码如下:
<example>歌德曾说过,<foreignphrase>Leben ist wie Sauerkraut</foreignphrase>。
我<emphasis>非常</emphasis>赞同这个观点。
</exampie>
然后将样式信息定义到另外一个称为样式单(stylesheet)的文档中,而不是将其和标签合二为一。样式单就像一个格式化程序的查找表,它将信息文档中的每个元素与显示设置映射。这使很多事情变得方便和容易。用户可以任意修改存储显示信息的样式单文件,而不是直接对XML文档进行全局查找和替换操作。如果用户不满意一种样式单中的显示方式,他可以使用另一个样式单文件进行替换。并且同一个样式单文件也能应用于多个XML文档。
由于没有将标记数据的标签与样式绑定,可以保持样式处于XML文档之外而增强显示可能性。因为一个XML文档可以应用任何合适的样式单文件,所以人们可以在闲暇时定义很多不同版本的样式单。同样,一个XML文档可以在台式计算机上显示,也能被打印机打印,被手持设备显示,甚至能被语音识别系统朗读出来,做到这些用户不必对原始数据文档有任何知识,只需应用不同的样式单。
为了便于XML在世界上的推广,XML必须简单。人们不想去学习一个复杂的系统,而只是为了编写一个文档。XML 1.0版本标准制定上保持了直观性、易于阅读并且语法优雅等特点。XML允许用户遵循一些合理的规则设计自己的标记语言。XML是SGML的一个很小的子集,它摒弃了很多SGML中人们不需要的繁琐部分。简单性对于应用程序开发也带来了好处。如果编写处理XML文件的程序很容易,就会有更多、更便宜的应用程序出现以供人们使用。
有一些标记语言对于语法错误过于宽容,任凭这类错误的出现和保持。这在某种程度上方便了用户对该标记语言的使用,但是从长远来看后果非常严重。如果在一个文件里出现了错误,那么它就不会按照人们期望的方式工作。比如:在浏览器中的显示效果不可预期。当应用程序读取存在错误的文件时,将会出现执行异常、数据信息丢失,甚至程序崩溃。
XML规范说明中提到,只有一个XML文件满足了一套最小的语法要求,才能说明这个XMI。文件是形式良好的。XML解释器是对XML文档进行语法解析和错误检测的应用程序。它会检测元素名称的拼写,确保元素边界正确,提示对象位置错误以及坏链等。也许人们会觉得XML这些严格的规则过于吹毛求疵,但是你在编写XML文档时尽量保持向标准靠拢是非常值得的,这是XML文档的可用性和持久性的保证。
将标记仅定义到一个狭窄的文化范围内,例如拉丁字母表和英语是不可取的。早先的标记语言就是这么设计的。为了摆脱这种文化的限制,XML的设计者选择Unicode(统一的字符编码标准,采用双字节对字符进行编码)作为XML的字符集,这样就可以支持世界上的各种国家的语言、行业符号以及其他特殊符号。
首先介绍XML文档内容的基本单元——元素,它的语法格式如下:
(标签)文本内容</标签>
元素是由起始标签、元素内容和结束标签组成的。用户把要描述的数据对象放在起始标签和结束标签之间。例如:<姓名>王平</姓名>。无论文本内容有多长或者多么复杂,XML元素中可以再嵌套别的元素,这样使相关信息构成等级结构。用这样韵方法定义XML文档数据和数据结构。
除了元素,XML文档中出现的有效对象是:声明、注释、根元素、子元素和属性。
1.声明:声明给XML解析器提供信息,使其能够正确解释文档内容,它的起始标识是“<?”,结束标识是“?>”。例如XML声明:<?xml version="1.0" encoding="GB2312"?>,该声明指明使用的XML版本号和文档使用的字符集是中文字符集“GB2312”。又如显示样式表文件声明:<?xml-stylesheet type="text/xsl" href="e12_2_1.xsl"?>,指明按e12_2_1.xsl样式表文件指定格式显示本XML文档。
2.注释:注释是XML文件中用作解释的字符数据,XML处理器不对它们进行任何处理。注释文本被“<!_”和“_>”标记,注释可以出现在XML元素问的任何地方,但是不可以嵌套。下边是一个注释的例子:<!_这是一个注释_>。
3.根元素和子元素:如果一个元素从文件头的序言部分之后开始,一直到文件尾,包含了文件中所有的数据信息,我们称之为根元素。XML元素是可以嵌套的,那么被嵌套在内的元素称为子元素。在前面的例子中,<学生>就是根元素,<编号>就是<学生>的子元素。一个XML文档中有且仅有一个根元素,其他所有的元素都是它的子元素。
4.属性:属性给元素提供进一步的说明信息,它必须出现在起始标签中。属性以名称/值成对出现,属性名不能重复,名称与取值之间用等号分隔,取值用引号括起来。例如:<工资 currency="US$">25000</工资>,其属性说明了薪水的货币单位是美元。
5.XML文档的基本结构:XML文档的基本结构由序言部分和一个根元素组成。序言包括了XML声明和DTD或XSD声明,DTD(Document Type Define,文档类型定义)和XSD(XML Schema,XML架构)都是用来描述XML文档的数据结构的。
6.格式良好的(Well-Formed)XML文档:一个XML文档首先应当是格式良好的,格式良好XML文档的正式定义位于:http://www.w3.org/TR/REC-xml。格式良好的XML文档除了要满足根元素唯一的特性之外,还包括:
①起始标签和结束标签应当匹配,结束标签是必不可少的;
②大小写应一致,XML对字母的大小写是敏感的,<employee>和<Employee>是完全不同的两个标签,所以结束标签在匹配时一定要注意大小写一致;
③元素应当正确嵌套,子元素应当完全包括在父辈元素中,下面例子就是错误嵌套:<A><B></A></B>,正确的嵌套方式为<A><B></B></A>;
④属性值必须包括在引号中,元素中的属性名是不允许重复的。