xml
读者可能会觉得在一本A S P书中讲述本章内容不太合适,事实上扩展标记语言( e X t e n s i b l eMarkup Language,X M L )正在越来越深入我们的生活,这是一件好事。X M L可以跨越所有边界,要获得真正独立的、跨平台的数据传送格式, X M L可能是唯一的选择。
这种说法可能会令人感到沮丧,但在计算机业内X M L几乎得到了所有大型(或小型)开发厂商的认可。标准能达到如此的统一,过去也只有在T C P / I P协议被采纳为网络协议的标准时出现过这种现象。X M L是一种国际标准,受一个工业标准团体的控制,得到全世界的广泛支持,并成为为数不多的只有一个标准的技术之一。
读者可能会觉得很奇怪,当今世界各种标准的变化就像季节更替一样频繁,即使是单个标准也被多个公司分成数段以追求竞争优势。然而, X M L却是个例外,因为它确实获得了许多公司的广泛支持。令人惊奇的是所有的人似乎都在努力实现并遵循这种唯一的标准。如果回想一下过去给工业界造成那么多麻烦的有关标准问题的争论, X M L就更令人惊奇了。
既然X M L是一个被普遍实现的标准,因此,在A S P中使用它也很简单。如果使用A S P创建一个We b站点,那么很有可能会使用某种形式的数据库来存储数据。而X M L是另一种存储数据的格式,其应用也越来越广泛,因此必须掌握它。当然X M L的功能不仅于此。
尽管立刻得到全面支持还不大可能,但我们已经看到X M L支持确实已引入到I E和A D O中。困难在于I E和A D O的发展速度不一致,所以它们之间的交互还不够理想,故本章没有介绍人们所希望的有关数据传输的万能技术。在写这本书时, I E和A D O的结合还不是紧密,但它们都在不断改进。所以尽管现在还没有新版本发布的具体消息,但A D O和I E将来肯定会更好地结合。
在给X M L一个明确的定义之前,最好了解什么是标记语言。首先这里有一个问题,因为“语言”这个术语用得并不恰当。实际上, X M L并不是编程语言,而V B或C + +才是真正的编程语言,X M L只是定义了如何标记文本或文档的一套规则。那么“标记”又是指什么?标记一个文档是指标识出文档的某些部分有特殊含义的过程。这可能难以理解,我们举一个有关超文本标记语言(Hypertext Markup Language,H T M L )的例子,因为“H T M L”中的“M”就代表了标记( M a r k u p )。
H T M L是一套规定文档布局的标记。H T M L包含了一些预先定义好的标记,每一种标记都有各自的含义,例如:
这是一个含有少量标记的文本。文本以< B O D Y >标记开始,在H T M L里,该标记表示文档主体的开始,主体部分以< / B O D Y >标记结束。在这个文档的主体内有标题,放在< H 1 >和< / H 1 >标记之间;另外还有一些粗体文本,放在< B >和< / B >标记之间。这些文本标记为有特殊含义的文本。
你可能注意到上面的例子没有使用格式化这个词。这是经过仔细考虑的,因为标记和格式化并不是一回事。< B O D Y >标记标定的是文档的一块区域,并没有定义任何格式。然而,< B >标记却标定文档的这一块区域用粗体显示。这是因为H T M L中的< B >标记是隐含了指定格式的标记。
所以请记住,标记语言只是一种规则,定义了如何给一篇文档中的特定部分增加特殊含义。这种定义可能会起到很好的格式化作用,但这并不是使用标记的唯一原因。
11.1.1 XML和H T M L的差别
尽管X M L和H T M L都使用标记,但是它们是不同的。其中最主要的区别是X M L专门用来描述文本的结构,而不是用于描述如何显示文本。X M L并没有一套固定的标记,例如:
上面的代码看起来与上一节的H T M L代码不是完全一样吗?如果它是H T M L文档,的确一样。如果把其加载到浏览器,以上内容就会显示如图11 - 1所示的结果,其作用好像是格式化文档。
但是,如果上面的代码是X M L文档,那么其中的标记就不具有任何含义,其内容只是说明:
? 有一个名为B O D Y的标记,在这个标记里面有一些文本。
? 有一个名为H 1的标记,在这个标记里面有一些文本。
? 有一个名为B的标记,在这个标记里面有一些文本。
如果以上代码作为一个X M L文档(文件的扩展名为. x m l )加载到I E浏览器中,可以看得非常清楚,其结果如图11 - 2所示。
I E解释该X M L文档并将其显示出来。请注意, I E并没对这个X M L文档做任何处理,仅仅是显示出来而已。浏览器知道如何解释H T M L文档,并且知道如何用标记所定义的格式来显示文档。同样,浏览器也知道如何解释X M L文档,但由于X M L标记不定义格式,所以文档不会得到格式化,于是原样显示这些标记。
但I E实际上还是做了一点格式编排,使X M L更易读了。它把标记分为不同的层次,所以我们看到了一套结构化的标记,且I E没有解释这些标记。
迄今为止所学的X M L文档由标记文档某些部分的标记组成。那么X M L使用数据会有什么问题呢,再看另一个例子。这个例子在前面的章节中出现过,读者会发现X M L在这里十分有意义。
上面的例子中使用了几对不同的标记。一开始,你可能会认为这些标记一定有其含义。他们都有一个有意义的名称,定义了A u t h o r的一个列表、单个A u t h o r以及一些与A u t h o r有关的值。在前面的章节中,这些内容出现了多次,当在一个浏览器中查看时,我们可以把它格式化成一个表来显示。但因为这是X M L,X M L中的标记不代表任何意义,如图11 - 3所示。
可见,这里I E没有对其进行任何处理。所以即使这些标记对我们来说是有意义的,但它们对X M L却没有。事实上,这段代码可以写成如下形式:
浏览器只是把这些标记原封不动地显示出来,如图11 - 4所示。
标记可以是你所喜欢的任意符号。当然,一开始就给其一个有意义的名字是很直观的。X M L的可读性十分强,所以一般使用能描述其内容的标记名字。
在此,已经看到X M L由一系列能描述文档各部分的标记组成。在以上使用A u t h o r信息的例子中,使用X M L来描述数据,使用了代表数据字段名的标记名。这就是X M L能作为一种数据交换格式的真正含义。它是标准的文本,所以可以很容易地从一台机器传送到另一台机器。但它并不是一种专用格式,所以任何人都可以读懂,并且如果标记名取得有意义的话, X M L数据就具有“自我描述”的功能。
11.1.2 标记和元素
使用了“标记”这个名字来确定某些H T M L的标记,比如< B >或< H 1 >。元素是指利用这些标记而形成的一个整体。例如:
因此,一个元素由一个开始标记和一个结束标记组成,它们把文本包围在中间,其中也可以包括其他子元素。这一点很重要,因为这牵涉到一个“形式化的X M L”的概念,其中每一个开始标记都必须有一个对应的结束标记。这一点与HTML 4.0及其以前的版本不同,在那些H T M L版本中,某些标记没有结束标记(例如< I M G >和< B R > )和< P >标记。
如果使用X M L来描述数据,有可能在一些域中不包含数据。在这种情况下,标记就为空。在X M L中有两种方法可以定义空标记。第一种方法是使用一个开始标记和一个结束标记,但其中没有内容:
形式化的X M L的另一层含义是X M L的标记是大小写敏感的,所以在这种情况下开始标记和结束标记必须一致。这也意味着下面这一行是无效的X M L:
1. 根标记
另一个需要知道的术语是根标记。它表示最外层的标记,一个X M L文档只能有一个根。例如再来看看A u t h o r的例子:
这里的根标记是< A u t h o r s >。因为这里只有一个根标记,故以上表述是合法的。但下面的代码是错误的:
11.1.3 模式和文档类型定义
我们一开始就声明了X M L标记实际上不代表任何意义,可以给标记取任何名字,但怎么才能知道什么类型的标记在文档中是允许使用的?因此必须使用文档类型定义( D o c u m e n tType Definition,D T D )或模式( S c h e m a )。模式和D T D的功能几乎是一样的,都规定了哪些元素在文档中可以使用,并可以把一个形式化的X M L文档转变为一个有效的X M L文档。也就是说它被正确标记(即有良好形式),并且只包含允许的元素和属性。
既用D T D也用模式的原因是因为微软觉得D T D在有些地方显得比较笨拙。D T D是一种定义X M L文档结构的文本文件,但D T D本身并不是X M L,有完全不同的语法规则。这就有点反常,所以在这一点上我们赞成微软的观点。如果处理X M L文档,那么定义那些文档的结构也应该是X M L,这就是模式所做的,即模式是D T D的X M L等价物。