下载第 11章 使用 XML数据读者可能会觉得在一本 A S P书中讲述本章内容不太合适,事实上扩展标记语言 ( e X t e n s i b l e
Markup 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的功能不仅于此。
本章将讨论以下内容:
XML数据的含义。
文档对象模型 (Document Object Model,D O M )是什么以及如何使用。
Active X 数据对象 ( A D O )怎样使用 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将来肯定会更好地结合。
11.1 XML的定义在给 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所示的结果,其作用好像是格式化文档。
图 11-1 浏览器中显示的 H T M L文档但是,如果上面的代码是 X M L文档,那么其中的标记就不具有任何含义,其内容只是说明:
有一个名为 B O D Y的标记,在这个标记里面有一些文本。
340计计 ASP 3 高级编程 下载
有一个名为 H 1的标记,在这个标记里面有一些文本。
有一个名为 B的标记,在这个标记里面有一些文本。
如果以上代码作为一个 X M L文档 (文件的扩展名为,x m l )加载到 I E浏览器中,可以看得非常清楚,其结果如图 11 - 2所示。
图 11-2 浏览器中显示的 X M L文档
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所示。
第 11章 使用 X M L数据 计计 341下载图 11-3 IE 浏览器中显示的 X M L
可见,这里 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
数据就具有“自我描述”的功能。
342计计 ASP 3 高级编程 下载图 11-4 浏览器显示的代码现在你应该理解了 X M L数据的含义,下面再来看一些术语,以及 X M L的不同方法。
11.1.2 标记和元素使用了“标记”这个名字来确定某些 H T M L的标记,比如 < B >或 < H 1 >。元素是指利用这些标记而形成的一个整体。例如:
这一行由两个开始标记和两个结束标记组成,但只有两个元素。 B元素由下面这一行组成:
而 I元素由下面这一行组成:
因此,一个元素由一个开始标记和一个结束标记组成,它们把文本包围在中间,其中也可以包括其他子元素。这一点很重要,因为这牵涉到一个“形式化的 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:
第 11章 使用 X M L数据 计计 343下载
1,根标记另一个需要知道的术语是根标记。它表示最外层的标记,一个 X M L文档只能有一个根。
例如再来看看 A u t h o r的例子:
这里的根标记是 < A u t h o r s >。因为这里只有一个根标记,故以上表述是合法的。但下面的代码是错误的:
这个例子里在顶层上有两个标记,因此这是无效的。
2,<?xml>标记这不是一个真正的 X M L标记,而是一个代表特殊处理指令的标记。 <? x m l >标记是用于每个 X M L文档首行的特殊标记,可以确定版本号和语言信息。例如:
这一行确定了 X M L的版本,即当前缺省的版本是 1,0版。目前,1,0版也是 X M L的唯一版本,但在 X M L文档中指定后,可在以后校对版本信息。
这个标记也可以定义 X M L数据中使用的语言种类。这很重要,因为在数据中包含的字符可能不是标准的英文 A S CⅡ码字符集。可以通过在,? x m l”处理指令中增加 e n c o d i n g属性来
344计计 ASP 3 高级编程 下载指定文档所用的编码方法。
表 11 - 1是一些常用语言及其字符集的列表。
表 11-1 常用语言及其字符集语 言 字 符 集
U n i c o d e ( 8位 ) U T F - 8
Latin 1(Western Europe,Latin America) I S O - 8 8 5 9 - 1
Latin 2(Central/Eastern Europe) I S O - 8 8 5 9 - 2
Latin 3(SE Europe) I S O - 8 8 5 9 - 3
Latin 4(Scandinavia/Baltic) I S O - 8 8 5 9 - 4
L a t i n / C y r i l l i c I S O - 8 8 5 9 - 5
L a t i n / A r a b i c I S O - 8 8 5 9 - 6
L a t i n / G r e e k I S O - 8 8 5 9 - 7
L a t i n / H e b r e w I S O - 8 8 5 9 - 8
L a t i n / Tu r k i s h I S O - 8 8 5 9 - 9
L a t i n / L a p p i s h / N o r d i c / E s k i m o I S O - 8 8 5 9 - 1 0
J a p a n e s e E U C - J P或 S h i f t _ J I S
如果想了解更多的有关国际化的细节,可以参考 W 3 C中关于这方面主题的网页,
其网址是 w w w,w 3 c,o rg / I n t e r n a t i o n a l /。
3,属性与 H T M L一样,X M L也用属性定义元素的特性,并且也必须是形式化的。属性必须用引号封闭起来,例如:
H T M L允许不用引号,但在 X M L中这是非法的。
4,特殊字符有一些在标准的 X M L字符串中不能使用的特殊字符,如表 11 - 2所示。
表 11-2 XML中的特殊字符及其替代字符字 符 替代的字符
& & a m p ;
< & l t ;
> & g t ;
" & q u o t ;
' & a p o s ;
例如下面的 X M L是非法的:
而以下 X M L是合法的:
大多数能自动生成 X M L的工具把这些字符转换成特殊的对应字符,但在自己生成 X M L时,
要注意必须使用长格式。在 X M L文档中使用这些单独的字符是非法的,如果文档中有这些字符,大多数 X M L处理程序将出错。
第 11章 使用 X M L数据 计计 345下载
11.1.3 模式和文档类型定义我们一开始就声明了 X M L标记实际上不代表任何意义,可以给标记取任何名字,但怎么才能知道什么类型的标记在文档中是允许使用的?因此必须使用文档类型定义 ( D o c u m e n t
Type 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等价物。
下面看一个典型的 D T D,它用于 authors XML文档,来自于 p u b s数据库:
这实际上很简单。它说明了文档由零个或多个 A U T H O R单元组成。 A U T H O R后面的加号指的是“一个或多个” 。每个 A U T H O R元素由九个其他元素构成。每个子元素都包含字符数据
( C D ATA )。
D T D有两个缺点:
不是 X M L。
不能为每一个元素指定数据类型,比如整数、日期等。 C D ATA仅表示元素只包含字符数据,并不确定元素内容的实际类型。
因为这些原因,微软向 W 3 C建议使用模式。如果将上面的 D T D文档转换为模式,上面的内容将变成:
再加上数据类型,将得到:
346计计 ASP 3 高级编程 下载现在模式不仅详细指出了可使用的元素,而且指明了数据类型。虽然 D T D的 C D ATA等价于一个字符串,但模式还允许其他数据类型,例如 c o n t r a c t元素就包含布尔型数据。
但有一点很重要,模式仍不是一个标准,所以这里没有更详细地叙述其结构和布局,以及如何使用它们。本章的内容实际上是关于如何在 A S P应用程序中使用 X M L数据,这可能也意味着将使用微软的 X M L工具。微软使用自己的模式格式,别的公司使用 D T D,现在还没有统一的标准。在本章后面的部分,将介绍当 A D O生成 X M L时所使用的模式。
因为以上内容是 X M L的一个核心部分,所以不得不提到它们,并且你在其他文档中也能看到模式和 D T D。然而使用 X M L数据的方法对模式本身并没有很大影响,因此我们把有关这方面的详细讨论写到了其他书中。
如果感兴趣的话可以参考 W3C We b站点 (网址 w w w,w 3 c,o rg / X M L / )中的详细介绍。
11.1.4 名称空间
X M L有一个问题:由于可以给一个元素取任意的名字,所以很有可能使用了别人用过的相同名字,或甚至在不同的 X M L文档中使用了相同的名字来表示不同的意思。例如,考虑下面的代码:
这是从 p u b s数据库中的 a u t h o r s表中取出来的,表示该作者是一个签过合同的作者。但是如果一个 X M L文档中包含以下内容,情况会是怎样?
这 C o n t r a c t元素确定了包含合同的文档。
当这两个 X M L文档分开时,不会出现问题,但如果把这两个文档结合起来,如何分辨
c o n t r a c t元素到底属于哪一个文档?这就是需要有名称空间 ( n a m e s p a c e )的原因,因为名称空间唯一地确定了哪个元素属于哪个模式。
通过在根标记中定义属性 x m l n s,将名称空间加入到 X M L文档,这需要一个统一资源标识符 (Uniform Resource Identifier,U R I )。这个 U R I只是一个能唯一地确定名称空间的名称。尽管任何唯一的名字都可以用作 U R I,但你会发现我们经常使用 We b站点的 U R L。例如看一下
c o n t r a c t的问题,它有两个不同类型的值。如果把来自两个不同源的 X M L数据组合起来,将得到以下结果:
第 11章 使用 X M L数据 计计 347下载如何才能分辨这两个 c o n t r a c t元素?答案就是使用名称空间。于是,把它加入 X M L文档:
这里通过加入 x m l n s属性来确定两个名称空间。其结构是:
s h o rt _ n a m e就是在 X M L文档中用来联系元素和标记的名称。你很快将看到如何使用它。
U R I只是一个名字,在 X M L文档中唯一地确定名称空间。这里需要着重注意的是,U R I只是纯粹的一个名字,实际上并不连接到 U R L,也不隐含任何与 We b服务器的连接。这只是一种唯一地确定每个名称空间的方法。只要它们在 X M L文档中是唯一的,可以用任何名称来命名。
在 X M L元素中,通过在标记前面加上适当的 s h o rt _ n a m e来指定元素属于哪一个名称空间。
这里,第一个元素属于名为 p u b s的名称空间,第二个元素则属于名为 w r o x的名称空间。
也可以将名称空间应用于属性,例如:
这里把名称空间应用于 a u _ i d元素的 t y p e属性,通过使用不同的名称空间或不使用名称空间把这个 t y p e属性与文档中其他元素的 t y p e属性唯一地区分开来。
以上主要讲述的意思是名称空间能确保正确地解释数据。如果 X M L文档含有某些需要进行特殊处理的信息,或者说包含一些特殊的信息,那么名称空间可以识别它们。使此 X M L与那些凑巧包含相同元素或属性的 X M L区分开。
同样,这是一个需要花费大量时间进行研究的领域,它已经超出了本章的范围。我们的真正目的只是想让读者理解什么是名称空间,在后面你会看到更多有关这方面的内容。在此并不想详细地研究它们,但现在你至少不会对它们是什么感到迷惑了。
11.1.5 文档对象模型文档对象模型 (Document Object Model,D O M )是针对 H T M L和 X M L文档的 A P I,定义了文档的逻辑结构以及访问它们的方法。这确实很重要,因为它定义了一个标准的访问和处理
X M L结构的方法。下面看一个简单的 X M L文档,然后再看看如何使用 D O M。
348计计 ASP 3 高级编程 下载
X M L文档本质上是分层结构的文档,也就是说,总是有一个顶层或根元素,然后在下面有一些子元素。所以,上面的文档可以用图 11 - 5来表示。
图 11-5 XML文档的分层结构如果子元素有很多,将会得到一个层次很深的树状图。用 D O M的术语来说,这些元素也称为节点 ( n o d e )。一个节点代表树状结构中的一个普通元素。
1,基本对象为了表现这种分层结构的本质,D O M提供了整套的对象、方法及属性以使我们能处理
D O M。在此不打算全部分析它们,但会讨论少数几个可能用到的对象和属性。首先介绍几个对象,如表 11 - 3所示。
表 11-3 基本对象及说明对 象 说 明
N o d e 在分层结构中的单个节点
N o d e L i s t 节点集合
N a m e N o d e M a p 允许用名字和索引号访问的节点集合还有一些用来访问节点的属性,如表 11 - 4所示。
表 11-4 属性及说明属 性 说 明
c h i l d N o d e s 返回一个包含子节点的 N o d e L i s t对象
f i r s t C h i l d 返回当前节点的第一个子节点
l a s t C h i l d 返回当前节点的最后一个子节点
p a r e n t N o d e 返回当前节点的父节点
p r e v i o u s S i b l i n g 返回上一个兄弟节点,也就是在分层结构中相同层上的前一个节点
n e x t S i b l i n g 返回下一个兄弟节点,也就是在分层结构中相同层上的后一个节点
n o d e N a m e 节点的名字
n o d e Va l u e 节点的值第 11章 使用 X M L数据 计计 349下载以上并没有列出全部的对象和属性,但能让我们明白使用它们可能做些什么。如果想得到全部的列表,可参考 M S D N帮助中有关 X M L的内容,也可在 m s d n,m i c r o s o f t,c o m / x m l /中找到相关内容。
下面详细分析一下前面例子中所用的文档的节点结构,如图 11 - 6所示。
图 11-6 例子中文档的节点结构此时,可以很清楚了解如何使用这些属性在 XML DOM中进行定位。虚线箭头指出了该属性指向那个节点。根节点 A u t h o r s下的子节点存放于 c h i l d N o d e s集合中。在上面的例子中,
由于根节点 A u t h o r s只有一个子节点,所以属性 f i r s t C h i l d和 l a s t C h i l d指向了同一个节点。在这种情况下,节点集合中唯一的节点就是 c h i l d N o d e s ( 0 )。
节点 A u t h o r有三个子节点,存放于一个 c h i l d N o d e s集合中。属性 f i r s t C h i l d (也就是
c h i l d N o d e s ( 0 ) )指向节点 a u _ i d,属性 l a s t C h i l d (也就是 c h i l d N o t e s ( 2 ) )指向节点 a u _ f n a m e。而属性
p r e v i o u s S i b l i n g和 n e x t S i b l i n g则在同一层分别指向节点集合中上一个和下一个兄弟节点。
那么,假定有一个指向 A u t h o r s,名为 n o d R o o t的节点对象,则节点的代码如表 11 - 5所示。
表 11-5 节点的代码表示法代 码 指向的节点
n o d R o o t,c h i l d N o d e s ( 0 ) A u t h o r
n o d R o o t,c h i l d N o d e s ( 0 ),f i r s t C h i l d a u _ i d
n o d R o o t,c h i l d N o d e s ( 0 ),f i r s t C h i l d,n e x t S i b l i n g a u _ l n a m e
n o d R o o t,c h i l d N o d e s ( 0 ),f i r s t C h i l d,p a r e n t N o d e A u t h o r
n o d R o o t,c h i l d N o d e s ( 0 ),f i r s t C h i l d,n e x t S i b l i n g,p a r e n t N o d e A u t h o r
在这一章后面,你会看到更多的有关这方面的例子。
2,特殊的 D O M对象
X M L是可扩展的,主要用于满足文档的多样性,所以针对不同的节点类型有一些特殊的对象。这些对象继承了 N o d e对象的大部分方法和属性,同时也增加了一些特别的方法与属性用于处理那些特殊的节点类型。这些对象及说明如表 11 - 6所示。
表 11-6 DOM的特殊对象及说明对 象 说 明
D o c u m e n t X M L文档的根对象
D o c u m e n t Ty p e 与 X M L有关的 D T D或模式的信息。等同于 D T D中的 ! D O C T Y P E
D o c u m e n t F r a g m e n t D o c u m e n t的轻量拷贝,用于临时存储或文档的插入操作
350计计 ASP 3 高级编程 下载
(续 )
对 象 说 明
E l e m e n t 一个 X M L元素
A t t r i b u t e或 A t t r 一个 X M L属性
E n t i t y 一个经过分析或未经过分析的实体。等同于 D T D中的 ! E N T I T Y
E n t i t y R e f e r e n c e 一个实体的引用
N o t a t i o n 一个符号,等同于 D T D中的 ! N O TAT I O N
C h a r a c t e r D a t a 文档中用于文本信息的基本对象
C D ATA S e c t i o n 未经过分析的字符数据。等同于 D T D中的 ! C D ATA
Te x t 元素或属性节点的文本内容
C o m m e n t 一个 X M L注释元素
P r o c e s s i n g I n s t r u c t i o n 一条处理指令,存放于 <>段中
I m p l e m e n t a t i o n 应用程序特殊的实现细节一般不会用到所有这些对象,这里也不打算深入地解释它们以及它们与 X M L的关系,因为这些内容超出了本章的范围。我们主要关心的是作为数据的 X M L的一些基础知识,以及如何使用和处理它们。
如果想了解有关 X M L和 D O M的更多知识,可以参考 Wr o x出版的,XML IE5
Programmer's Reference》,ISBN 1-861001-57-6。也可以通过查看微软的网站
http://msdn.microsoft.com/xml/ 或 W 3 C的网站 h t t p,/ / w w w,w 3,o rg / D O M /来获得这方面的资料。
3,使用 D O M
因为 X M L是一个相对较新的领域,许多浏览器都不支持 X M L数据的处理。事实上,I E
5,0才是唯一对其支持较好的浏览器。所以,作为一个 A S P开发者,必须决定是否将 X M L数据发送到浏览器,还是在 A S P页面上处理 X M L数据并向浏览器发送纯粹的 H T M L。当然,这取决于接收数据的一方。但不论使用哪种方法,懂得如何使用 D O M以及如何访问 X M L对象是有用的。
因此,这一节通过使用一个名为 Tr a v e r s e X M L,h t m l的网页,将让我们了解,如何利用
D O M来访问 X M L文档,可在下载的代码中找到这个网页。这里计划采用 IE 5,带有一个 X M L
数据岛 (XML Data Island)。在上一章节学习 R D S时,见过这个术语。数据岛其实只是一个与数据控件作用相似的 H T M L标记。
此时,有了一个名为 d s o D a t a的数据岛,包含来自 X M L文件 a u t h o r s,x m l的数据。既然是数据岛,就不会在屏幕上显示任何内容,即它只是一个数据容器。所以,需要一种从中提取并显示数据的方法。
为了做到这一点,使用一个 S PA N元素,当然也可以使用其他几种类型的元素。
我们的目的是利用 D O M从数据岛中提取 X M L信息,并将数据在 S PA N元素中显示出来。
先从根节点开始,找到所有子节点并显示它们的详细信息。我们将显示节点的名称、类型及其值。同样,既然子节点能包含子节点,所以可以重复以上的过程,遍历整个树状结构,直到所有的节点都被访问到。因为这是一个有关树的遍历操作,所以可以使用一个递归的函数第 11章 使用 X M L数据 计计 351下载来实现。
节点的类型是要显示的信息之一。这可以用一个整数来识别,但鉴于数字的可读性差,
所以把其转换为一个描述节点类型的字符串。为了做到这一点,事先需要声明一个全局数组,
其中包含描述节点类型的文本,同时使用实际的节点类型数字作为索引。在 J S c r i p t代码的最上端,放置如下代码:
递归函数 s h o w C h i l d N o d e s接收一个 X M L节点,以及一个代表当前节点在分层结构中的层次的整数。这允许我们输出层次化内容,因此很容易读懂:
接下来可以开始构建字符串,首先是当前节点的名称、类型及其值。节点类型由一个整数来确定,这里通过使用前面定义的数组来获得有关节点类型的描述。 g e t I n d e n t函数只返回一个空字符串,包含的空格数目最多等于树的层次:
下一步需要考虑这一节点是否有属性,如果有的话,必须再次遍历,并加到字符串中:
最后,需要检查该节点是否还有子节点,对于其每一个子节点,调用相同的函数。对于碰到的每个节点重复构建以上字符串:
352计计 ASP 3 高级编程 下载为了显示输出结果,可以使用如下代码:
这里只是调用了该函数,并将顶层节点传入函数中。结果如图 11 - 7所示。
图 11-7 显示的 X M L文档的节点这里,你看到了 X M L的 D O M的递归特性。图 11 - 7的最上面是一个 # D o c u m e n t类型的节点,
是所有继承者的父节点,即所有 X M L文档的根节点。但注意,它并不是一个真正的元素,其类型为 D o c u m e n t。所以 X M L数据的根是 X M L文档,但其下面是 X M L元素。
第一个元素,或者说根元素是 A u t h o r s元素。它包含每一个 A u t h o r元素,以及 A u t h o r的每一个属性元素。同时,需要注意的是端节点 (也就是没有子节点的节点 )有另一个名为 # t e x t的节点。它包含实际的节点文本,文本的内容令许多人觉得不解。为什么每个元素都有一个 n u l l
值,而它的子元素 # t e x t却含有节点的文本值?为什么不让节点的值包含节点的文本?答案是很显然的,因为节点除了包含文本外,还可能包含子节点。如果一个节点既包含文本又包含节点,那么此节点的值应该是什么?是文本,还是一个子节点的指针?由于存在着这种多义性,W 3 C最终规定总将一个节点的文本放在一个类型为 T E X T的子节点中。
但你可能会奇怪:为什么访问节点的值时,并没有移到树的另一层来访问它的子节点?
请看下一行代码:
这里只用了 n o d e Va l u e属性,这是微软对 D O M的一个扩展。在 W 3 C的规范上,并没有提供第 11章 使用 X M L数据 计计 353下载一种简单地访问节点值的方法,必须移到子节点来访问与之关联的 T E X T节点。由于微软认为访问节点的值并获取其所含文本可能是最常见的操作,所以引入了 n o d e Va l u e属性,它处理
T E X T子节点。
这里,已经简单介绍了 D O M是什么,并说明了它以树状结构保存 X M L数据。现在,你应该明白 X M L是什么以及如何访问它,接下来需要了解一下 X M L是如何与 A D O和 I E浏览器紧密结合的。
11.2 ADO和 IE 5中的 X M L
ADO 2.5的最大特点之一是:允许以 X M L文档的形式访问一个记录集。其优点在于能提供一种不同的处理数据的方法。你可能认为这并不是很重要,那么考虑一下下面的因素:
并不是每个处理数据的程序员都懂 A D O。许多程序员只是擅长于 H T M L或脚本语言,因此为了能通过 X M L访问数据,D O M对他们来说应该是更可取的。
并不是每个程序员都既懂 X M L又懂 D O M,因此允许通过记录集来访问 X M L文档就意味着他们能充分利用自己所掌握的技术。
数据处理工作大多是关于数据的显示。如果用户不能访问和看见他们,这些数据的用处就不大,而 X M L提供了解决这一问题的方法。
用 X M L来编写的内容越来越多。
开发出来的 X M L工具越来越多。
以上这些观点加起来足可以说服我们学习 X M L。
11.2.1 存储为 X M L形式的 A D O记录集一提到 X M L和 A D O,首先需要了解的是 A D O是如何以 X M L的形式呈现数据的。一会儿将介绍从 A D O中提取数据的方法,现在先来看一下 X M L的数据格式。
如果看一段直接由 A D O转化来的 a u t h o r s表,你可能会感到一点惊讶:
这不像过去使用的 X M L。在表中每一行对应一个元素,而不是每个字段对应一个元素,
字段只是行元素的属性。为什么会这样?微软使用这种方法的原因是因为基于元素的 X M L文档相当繁琐。如果只用元素将一个大的记录集转换为 X M L文档,它将极为巨大。因为每一个字段都有一个开始标记和一个结束标记。因此,这种为每个数据项使用属性来定义数据的方式就减少了不必要的重复工作。
尽管微软正在寻找一种类似开关的技术来使用基于元素的方法,但以上方法是目前唯一能从 A D O中提取 X M L数据的方法。在写这本书时,还不清楚在 ADO 2.5版本中是否用到了这种技术,或者在今后的版本中是否会用到它。
354计计 ASP 3 高级编程 下载
11.2.2 ADO记录集名称空间如果使用 A D O发送和检索 X M L数据,会见到一个与 X M L数据文件关联的模式。这个模式嵌入到 X M L文档的顶端。这里有必要研究一下。首先要注意的是根元素,它确定了几个名称空间:
这些名称空间如表 11 - 7所示。
表 11-7 名称空间及说明名称空间 说 明
s 确定模式的 U R I
d t 确定数据类型的 U R I
r s 确定行集 (记录集 )
z 确定单独的行记住,名称空间能唯一地确定 X M L文档或其中的元素。使用名称空间保证了元素名应用于正确的模式。
11.2.3 ADO记录集模式那么,可用一个名称空间来定义模式和记录集的独特属性,看一下模式本身:
第 11章 使用 X M L数据 计计 355下载下面详细分析一下上述代码,你能对代码中不同的代码行有更深的理解。
1,行元素先从确定模式的元素开始:
这里有一个名为 S c h e m a的 X M L元素,这是代表模式的顶层元素。用名为 s的名称空间来唯一地确定模式,并给模式一个 i d属性。这就像给任意类型的数据字段一个 I D一样。在模式中,i d确定了模式本身。
接下来使用 E l e m e n Ty p e来定义元素:
这个元素有两个属性。第一个是 n a m e属性,给元素提供一个名字。上面这一行表明此元素的名字为 r o w,别忘了数据是如何为记录集中的每一行包含一行的。第二个属性为 c o n t e n t,
确定了元素所保存的内容。其可能的值及说明如表 11 - 8所示。
表 11-8 content属性的值及说明值 说 明
e m p t y 此元素不能包含任何内容
t e x t O n l y 此元素只能包含文本,而不是其他元素
e l t O n l y 此元素只能包含其他元素,而不是文本
b o t h 此元素既可以包含文本又可以包含其他元素因此,这一行代码的作用是确定一个只能包含其他元素的行元素。如果查看一下 X M L数据,会看到下面的数据:
既然这本来就是一个空标记,你可能想把类型设为 e m p t y;但是对模式来说,e m p t y意味着根本没有内容,包括没有属性。
2,字段的属性如果回顾一下 X M L数据,会发现字段的值其实是以属性来表示的。所以在模式中必须定义这些属性。这包括两部分内容,首先是定义属性本身,其次是定义属性的数据类型。
为了定义一个属性,首先必须定义属性的名字,它应该映射到数据字段的名字。另外定义两个其他的属性。第一个是为每个属性定义的唯一的一个数字,这是第一个属性,所以给其取值为1,剩下的属性依次编号。另一个属性是 w r i t e u n k n o w n,它定义了属性是否能被更新:
A t t r i b u t e Type 还用一个子元素定义属性的数据类型:
356计计 ASP 3 高级编程 下载这包含了数据的类型、最大长度以及属性是否允许为空值。
其他数据类型可能会包含一些不同的信息。例如,c o n t r a c t字段包含下面的内容:
这里多了一个属性,它用来确定数据类型是否包含固定长度的数据。
3,数据类型当从 A D O中生成 X M L数据时,数据类型会自动产生,但如果想自己编写 X M L,或为已经存在的 X M L创建模式,可能希望增加对数据类型的支持。毕竟,这是模式优于 D T D的一个方面。表 11 - 9列出了 X M L数据模式支持的数据类型。
表 11-9 XML数据模式支持的数据类型及说明类 型 说 明
b i n,b a s e 6 4 一个二进制对象
b i n,h e x 十六进制的八位组
b o o l e a n 0或 1 ( 0代表 f a l s e,1代表 t r u e )
c h a r 一个字符长度的字符串
d a t e 一个 ISO 8601日期类型,不带时间。格式为 y y y y - m m - d d
d a t e Ti m e 一个 ISO 8601日期类型,可以带时间。格式为 y y y y - m m - d d T h h,m m,s s
d a t e Ti m e,t z 一个 ISO 8601日期类型,可以带时间和时区。格式为 y y y y - m m - d d T h h,m m,s s - h h,m m。
时区用超过 ( + )或落后 ( - )于格林尼治标准时间 ( G M T )的小时数来表示
f i x e d,1 4,4 固定的浮点数,左边最多有 1 4位整数位,右边最多有 4位小数位
f l o a t 浮点数
i n t 整数类型
n u m b e r 浮点数
t i m e 一个 ISO 8601时间。格式为 h h,m m,s s
t i m e,t z 一个可带有时区的 ISO 8601时间。格式为 h h,m m,s s - h h,m m
i 1 一个八位整数 (一个字节 )
i 2 一个十六位整数 (二个字节 )
i 4 一个三十二位整数 (四个字节 )
r 4 一个四位实数
r 8 一个八位实数
u i 1 一个八位无符号整数 (一个字节 )
u i 2 一个十六位无符号整数 (二个字节 )
u i 4 一个三十二位无符号整数 (四个字节 )
u r i 统一资源标识符
u u i d 一系列十六进制数字,代表一个唯一的标识符。 G U I D就是一个例子
W 3 C也规定了一些原始类型,如表 11 - 1 0所示。
表 11-10 W3C规定的一些原始类型及说明类 型 说 明
e n t i t y 代表 X M L的 E N T I T Y类型
e n t i t i e s 代表 X M L的 E N T I T I E S类型
e n u m e r a t i o n 代表一个枚举类型
i d 代表 X M L的 I D类型
i d r e f 代表 X M L的 I D R E F类型
i d r e f s 代表 X M L的 I D R E F S类型第 11章 使用 X M L数据 计计 357下载
(续 )
类 型 说 明
n m t o k e n 代表 X M L的 N M TO K E N类型
n m t o k e n s 代表 X M L的 N M TO K E N S类型
n o t a t i o n 代表 X M L的 N O TAT I O N类型
s t r i n g 代表字符串类型
11.2.4 IE数据岛和绑定我们已经介绍了几个 X M L数据岛的例子,回忆一下当时它们是如何创建的和如何将
H T M L元素绑定到 X M L数据岛。可以在一个 H T M L页面中用 < X M L >标记创建一个数据岛,例如:
这里引用了一个外部 X M L文件作为数据源。另外可以在 X M L标记内嵌入 X M L数据:
在前一章中详细讨论过绑定。绑定可以采用两种形式。第一种是绑定单个元素,例如:
以上代码将单个元素绑定到数据源的一个字段。另一种方法是使用表绑定,做法是先把表绑定到数据源,然后再将表中的元素绑定到数据字段:
这个表将给出图 11 - 8所示的结果。
这里不再对此进行详细讨论,因为在前一章中已经分析过这个简单的例子。
1,绑定分层的数据迄今为止,所有分析的数据都相当简单,
但是如果想绑定一组由 A D O产生的 X M L数据的话,就会发现一个问题。这主要是因为 I E没有将模式当作数据的定义,也就是说 I E所理解的是下面的内容:
358计计 ASP 3 高级编程 下载图 11-8 显示绑定的数据即 I E看到了两组数据,即模式和真实的数据。但这并不是问题的全部,别忘了我们需要的数据是放在行内的,所以数据有两个层次,这也意味着必须做一点额外的工作。
对这种分层的数据进行绑定的解决方法是 (在 d a t a b i n d i n g,h t m l中有示范 )使用两层绑定:
这里,先把外部的表与含有所有数据的元素进行绑定,然后把一个内部的表绑定到数据行。这样,各个字段就同以前一样全部绑定完毕。
如果有多层的分层结构,那么只需增加更多的层来进行绑定。例如,看一下下面的 X M L
数据:
以上数据包含了几个不同的数据层。首先是出版商 ( p u b l i s h e r s ),然后每个出版商对应一个雇员 ( e m p l o y e e s )的列表和一个销售情况 ( s a l e s )的列表。接下来,每个销售情况有一个销售书目的列表。图 11 - 9展示了这种结构。
假定在 X M L中有这样的层次数据,并且想在浏览器中很快看见这些数据,那么需要做的就是要获得包含出版商的顶层表。对于每个出版商,包含两个子表,一个包含雇员,一个包第 11章 使用 X M L数据 计计 359下载含销售情况。而对于每个销售情况又有其他表来详细描述销售书目。
图 11-9 多层分层结构绑定这种多层数据的唯一方法是使用分层绑定。对于上面的 X M L,可以按照下面的代码来实现嵌套的表:
360计计 ASP 3 高级编程 下载这里有几个绑定的表,使用 X M L数据中的连续的层作为数据源,最后的结果如图 11 - 1 0所示。
这里所做的只是在 H T M L中增加了一些绑定的表,而实际的数据仍由 X M L数据岛来提供。现在的显示结果并不是太美观,但只要稍加格式化,就能得到一个令人满意的显示结果,如图 11 - 11所示。
如果觉得 H T M L绑定有一些混乱,也可以在
D ATA F L D属性中包含分层结构的层,这样可以看得更清楚一些。例如:
这并没有改变什么,只是可以更清楚地看到了 s a l e字段在分层结构中的位置。
图 11 - 11 多层绑定格式化后显示的结果
11.2.5 以 X M L数据格式保存记录集通过使用 R e c o r d s e t对象的 S a v e方法并指定存储格式为 a d P e r s i s t X M L,A D O可以很容易地生成 X M L格式的记录集。这在 ADO 2.5中并不是新内容,新颖之处在于能直接将分层结构的记录集转化成别的对象,如 S t r e a m和 D O M对象。
第 11章 使用 X M L数据 计计 361下载图 11-10 多层绑定显示的结果由于我们不再局限于创建包含 X M L数据的文本文件,因此这一特性为数据的处理和传输提供了各种可能性。这又有什么好处?作为一个程序员可能会希望有:
一种简单的生成数据的方法。
一种能快速传输数据的方法。
创建文本文件是容易的,但比较慢。因为它涉及向磁盘中写文件,然后从磁盘中读文件并处理。应该尽可能地排除这种速度缓慢的操作,因为需要的是一种快速处理数据的方法。
容易做的事未必是一件好事。
1,将 A D O记录集转换为 X M L文件将 A D O记录集转换为 X M L文件的最简单的方法是使用 A D O以前版本中的 S a v e方法:
这里没有什么新内容,把它包括进来是为了便于和其他方法做比较。
2,将 A D O记录集转换为一个流流只是在内存中的一块数据,没有进行任何方式的处理。 ADO 2.5版本引入了新的 S t r e a m
对象,它可以作为记录集保存的目标,例如:
现在获得了一个包含 X M L记录集的 S t r e a m对象,可以用 S t r e a m对象的方法和属性来处理数据。例如,可以使用 R e a d Te x t方法将 X M L数据提取到字符串中:
此时,s t r X M L A u t h o r s包含完整的 X M L记录集,其中也包括模式。
3,把 A D O记录集转换为 R e s p o n s e对象其他关于流的观点更为直接。其中有一种把它定义为“流动或移动的连续体” 。因此,我们不妨把数据流看成是从一个地方移动到另一个地方的数据流。现在,考虑一下从 A S P页面向浏览器发送数据的过程,实际上这也是一种数据流。
要这样做可以使用 R e s p o n s e对象的一个新特征,它提供对流的支持。因此,可以把数据输出到流的一个端,并让它达到另一端。我们使用的一端是 R e s p o n s e对象,另一端是浏览器。
因为在 R e s p o n s e对象中集成了对流的支持,所以可以使用下面的代码:
上面的代码直接将记录集以 X M L数据格式存入 R e s p o n s e对象。然后 R e s p o n s e对象负责向浏览器发送数据。这种方式非常好。
4,创建 X M L数据岛看起来创建数据岛似乎是一种理想的做法,但并不像把 X M L数据保存到 R e s p o n s e对象那样简单。事实上这样做往往是非常困难的。
这主要是因为 X M L数据岛是一个带有两个属性的 H T M L标记:
ID:一般的 HTML ID属性,它唯一地确定元素。
SRC:它确定 X M L源文件。
如果手工创建数据岛,可以使用下面的代码:
362计计 ASP 3 高级编程 下载也可以不使用 S R C属性,而直接把 X M L数据放在 X M L标记内,例如:
后一种方法似乎更理想。例如,假定有一个含有以下代码的 A S P页面:
在 H T M L页面中是以下内容:
我们删去了一些数据以便能看得更清楚一些。首先应该承认,这看起来象一个数据岛,
但又不具有 I D属性,所以不能给它绑定任何字段。这不是一个太大的问题,因为我们可以给
H T M L元素增加属性。这可以在页面加载时在浏览器中或在客户端脚本中实现,或者在 X M L
数据发送给客户之前在 A S P代码中实现。这里不想介绍如何做,因为实际上这不能真正解决什么问题。
必须记住数据岛是一个 H T M L标记,这会带来两个问题:
在 X M L中的数据是无效的,因为有两个根元素,s,S c h e m a和 r s,d a t a。
所有非 X M L的属性将被忽略。因此所有的名称空间信息 ( x m l n s属性 )将被忽略,致使
X M L包含的数据无效。
接下来将一个 X M L标记放入 A S P代码中,例如:
第 11章 使用 X M L数据 计计 363下载现在,在浏览器中显示出下面的内容:
从逻辑上来说,上面的代码应该可以正常工作,但是,在一个数据岛内不能有名为 X M L
的标记。
既然不能拥有一个名为 X M L的内部标记,为什么不能在 A S P代码中重新命名它?也许可以将 X M L加载到 D O M中,并且改变 n o d e N a m e属性。但是这仍行不通,因为在 D O M中,顶层元素的名称是不允许改变的。
那么,现在该怎么办?看上去直接将一个记录集保存为 R e s p o n s e对象无法创建一个数据岛。这可能是因为 A D O和 I E发展的方式不同,这将来也许会得到改善。
然而,不要认为这不可能,因为有很多方式可创建一个数据岛,但并不只是涉及
R e c o r d s e t对象。其中一种方法就是使用 D O M。
5,将 A D O记录集转换为一个 D O M对象迄今为止,我们已经知道可以将记录集保存为一个文件,或者是 R e s p o n s e对象。另外,
还可以将一个记录集保存为 D O M对象。在本章的前面部分,曾经提到 D O M对象以及如何使用该对象处理 X M L。因此,在 A S P代码中可以这样做:
364计计 ASP 3 高级编程 下载此时,D O M对象 x m l D O M包含了记录集中的数据。这允许在将数据发送到浏览器之前,
根据需要对数据进行处理。在本章后面,你会看到有关更多的例子。
借助 D O M来创建数据岛
D O M比较有用的地方之一是可以创建数据岛。虽然不是一种十分优秀的解决方法 (许多人更愿意称之为一个恐怖的黑客 ),但是处理速度很快,工作起来也很正常。我们可以用一个字符串从 D O M中获取 X M L。例如:
此时,变量 s t r X M L包含 X M L数据。那么,这对我们有什么帮助?前面已经说了,在数据岛内不能有一个名为 < X M L >的标签,也无法重新命名顶层元素。那么可以这样处理这个字符串:
因为 X M L必须始于,< X M L”,并且终于,X M L >”,所以只需替换掉那部分字符串。至于用什么来替换它们无关紧要,只要不是 X M L就可以。
这样,现在的 A S P代码应该是这样:
当然,这并不是什么伟大的技术解决方案,但确实可以运行,而且工作情况良好。使我们能够轻而易举地从 A S P创建一个数据岛,而且在 A D O与 I E之间仍存在障碍的时候,这还不失为一个好途径。
11.2.6 打开记录集既然有许多方法可以将记录集保存为 X M L,那么反过来,自然也就有多种用记录集提取第 11章 使用 X M L数据 计计 365下载
X M L数据的方法。然而需要注意的是,A D O记录集只能识别微软的 X M L数据模式,如果你所用的 X M L与这种模式不一致,就不能将它加载到一个 R e c o r d s e t对象中。这也是另一个令人苦恼的由于 A D O中的 X M L支持缺乏灵活性而引起的问题。
1,从 X M L文件打开记录集从一个 X M L文件加载记录集与保存这个记录集同样简单,例如:
这将打开 X M L文件,再将其解析为记录集。所用的文件名必须是一个物理路径名。
2,从 R e q u e s t对象打开记录集前面已经提到流已被添加进 R e s p o n s e对象中,其实流也被添加到了 R e q u e s t对象中。这就意味着可以执行如下操作:
这样做的好处是可以与 IE 5.0中引入的 X M L H T T P对象协同工作。 X M L H T T P对象能利用
H T T P协议向服务器发送 X M L数据或从服务器发送 X M L数据给客户。微软将一些 H T T P功能封装进 X M L H T T P对象是为了便于使用。在此不打算对它做进一步的阐述,如果需要更多的信息,请查阅 IE 5的文档或 M S D N。
这个对象使我们能够从客户应用程序将 X M L发送到 A S P网页。下面的代码是一个实现该功能的客户页面的例子:
本例利用 O p e n方法,并指定使用的 H T T P方法以及要连接到的 U R L来初始化一个请求。最后的 f a l s e表明不使用异步通信。然后用 s e n d方法来将 X M L数据岛的内容传送到指定的 U R L。
使用 P O S T方法的结果是一个被传送到指定的 U R L的 X M L流。在上面的例子中,指定了一个 A S P网页,并且 X M L以 R e q u e s t对象的形式出现在这个 A S P网页中,因为这是一个普通的
H T T P请求。这意味着可以使用下面的代码:
3,从 D O M对象打开记录集虽然能直接将记录集保存为 X M L的 D O M对象,但却不能直接从 D O M对象打开记录集。
这对于那些本身支持流的对象来说显得比较奇怪,不过,对于这个问题有一个解决方法。只是这种方法稍有一点复杂,牵涉到一个 S t r e a m对象。
需要将 D O M中的 X M L数据保存到一个 S t r e a m对象中,然后从这个 S t r e a m对象打开记录集。
366计计 ASP 3 高级编程 下载结果与其他方法是相同的,只是需要额外的一个步骤。下面是一个例子:
这种解决方法稍有点繁琐,但运行效果良好。同样,这个领域一定会随着时间的推移而日趋完善,当 A D O实现了更好的方法后,上述方法可能就会没用了。
对上述代码加以修改,能得到一种复制记录集的简便方法。下面是一个 Visual Basic例子,
可用于一个组件中:
这段代码不很长,但假如需要记录集的一个拷贝,这还是很有用的。这不同于克隆,克隆将产生单个记录集和两个对它的引用,而这方法则创建了一个全新的记录集的拷贝。
11.3 用 X S L来设计 X M L
X S L即可扩展样式语言 (eXtensible Styling Language),是一种用于转换 X M L数据的基于
X M L的语言。这种转换可以在 X M L的一种格式与另一种格式间进行,或者可以从 X M L转换到
H T M L格式,也可以从 X M L转换到任意类型的文本输出。
第 11章 使用 X M L数据 计计 367下载
X S L产生的原因之一是因为 X M L纯粹用于数据。我们已经说过 X M L标记只用于识别数据,
不像 H T M L标记那样可以用来指定数据格式。因此,需要使用某种方式来格式化 X M L以显示
X M L数据。
X S L由两部分构成,即转换语言和格式化语言,这里讨论的核心是转换部分。为什么这样说?这只是因为 X S L现在还不是一种规范的标准,也就是说大多数浏览器对它的支持是不完全的。几个主要的浏览器基本上都不支持 X S L的格式化部分,许多浏览器甚至连它的转换部分也不支持。
微软发布 IE 5时,按照当时建立的标准加入了对 X S L转换部分的支持。但自那以后由于标准一直在发展,微软决定不再更新其对 X S L的支持,除非这种标准得到认可。这意味着 IE 5并不支持 X S L的格式化部分,但部分地支持其转换语言。
如果需要使用 X S L的最新版本,可以使用符合最新标准的 X S L解析器。 W 3 C 的网站 ( w w w,w 3 c,o r g ) 详细说明了 X S L标准的现状,w w w,o a s i s - o p e n,o r g / c o v e r / x s l,h t m l 站点也在追踪着这个标准的发展方向,并且还有一些关于 X S L的软件和文章。
X S L样式表
X S L是根据一套与 X M L中的元素或属性相匹配的规则设计的。这些规则被称为模板,在一个模板内你可以循环访问元素和属性,并可以应用其他模板执行其他类型的处理。凡是不属于 X S L处理指令的组成部分的文本都被输出,这就是通过匹配元素与输出文本和元素的值来转换 X M L的过程。
下面来考虑一下本章前面用过的由 A D O生成的关于 a u t h o r s的 X M L文件,这里介绍如何将这个 X M L文件转换成 H T M L表。但我们并不打算详细讨论 X S L,一是因为该主题太大,二是因为这也超出了本书的范围。我们只是想说明使用 X S L能做些什么。 X S L的一个功能是能将
X M L转换成 H T M L。
首先需要理解 X S L是 X M L的一种形式,所以它也由一系列标记组成。一个样式表
( s t y l e s h e e t )的顶层标记如下所示:
以上代码确定了样式表和应用于它的名称空间。既然是 X M L,那么样式表的最后就应该有结束标记:
在样式表内,标记采用模板的形式,匹配部分的 X M L文档。也就是说只有先匹配 X M L标记,然后才能输出标记的值,以及其他文本。下面分析一个简单的样式表,了解其工作方式:
368计计 ASP 3 高级编程 下载这个样式表将 X M L格式的 A D O记录集转换为一个 H T M L表。下面进行详细地分析。首先是样式表的声明:
接下来是 t e m p l a t e命令,指明了要匹配的元素。在这里匹配的是根元素,由符号 " / "表示:
此时,开始处理 X M L树。如果要把 X M L转换为 H T M L,需要输出开始一个 H T M L文档的
H T M L标记:
现在的任务是查找实际的数据。如果回想一下对 X M L格式的记录集的研究,会记得记录集的数据是存放在 r s,d a t a元素里的,因此用 a p p l y - t e m p l a t e来寻找另一个模板。一旦应用该模板并且在此模板内的所有处理都完成后,处理过程就回到当前的模板:
在处理完内部模板后,就可以结束 H T M L文档了:
现在到了样式表的核心部分,在这里处理数据:
所有的数据都保存在 r s,d a t a元素内,而每一行存放在 z,r o w元素内。字段存放在行的属性中。首先输出 < H T M L >标记以开始创建表:
需要处理每一行数据,因为这将成为 H T M L表的一行。为此,使用 f o r-each 语句,它与
V B S c r i p t中的 f o r.,,e a c h循环语句是一样的。语句的 s e l e c t部分告诉 X S L循环访问的是哪些元素—
在这里是每个 z,r o w元素:
此时已有一个数据行,因此可以用下面的代码开始输出 H T M L行:
现在需要处理属性。这些属性是与记录集的字段相对应的,同样使用 f o r- e a c h结构。但此时 s e l e c t不同,需要匹配每个属性,不管这些属性叫什么名字。实际上,如果这个程序用来处理由 A D O生成的 X M L文档,那么就不可能知道任何行、元素和属性等的名称,因此,使用第 11章 使用 X M L数据 计计 369下载
,*”号作为通配符,它什么都可以匹配。比如为了匹配一个属性,必须使用“@”符号,所以“@ *”就意味着可以匹配每一种属性:
接下来,开始创建 H T M L窗体元:
在窗体元内,需要获得属性的值。指令 Va l u e - o f告诉 X S L输出一个节点的值,由于并没有规定任何需要特殊输出的内容,所以便输出当前节点的值:
下面是循环的结尾,关闭窗体元,关闭表的行,最后关闭这个表:
虽然这看起来不是很简单,但是并没有脱离常规的编程规则。它看上去显得比较古怪,
这是因为所有的操作都由 X M L指定的,并且其语法也都是围绕着匹配 X M L中的节点,不过像循环这类的操作已经很接近标准的编程习惯了。
1,嵌入的样式应用一个 X M L样式表的最简单的方法是在 X M L文件中指定样式表。这只需将下面这行加到 X M L文件的顶端:
对一个 A S P程序员来说,这显得不是很灵活,因为这意味着物理地创建一个 X M L文件,
然后编辑它并放入样式表的引用。
2,动态样式可以动态地应用样式表,而不是把它嵌入到 X M L中。可以在发送 X M L数据到浏览器之前,
在 A S P页面内动态地应用样式表。例如:
370计计 ASP 3 高级编程 下载这与在本章和前一章中所见的代码没有多大差别。现在已经创建一个记录集并保存为
XML DOM对象。不同之处在于接下来将样式表加载到另一个 XML DOM对象中,并使用了
Tr a n s f o r m N o d e To O b j e c t方法来应用这个样式表。
上述方法的优点是对客户只发送纯粹的 H T M L,因此需要使用 X M L数据时,就无须考虑浏览器是否可以处理 X M L,这一点非常有用。如果用户使用的浏览器支持 X M,也可以在客户端执行这种转换操作。
下面的例子使用了三个数据岛。第一个用来存储 X M L数据,后面二个用来存储样式表,
记住它们是 X M L,所以这样做是很合法的。一个样式表把 X M L转换成一个表,另一个把 X M L
转换成一个列表。
然后创建两个按钮,以调用执行样式化的函数:
接下来创建一个 D I V元素,这是表或列表将要显示的地方:
最后,创建执行转换的函数。它使用数据源的 Tr a n s f o r m N o d e方法将选择的样式表应用到
X M L数据。其结果显示在 D I V元素中:
如果想在客户端完成数据转换,以上方法是非常有用的。尽管这个方法依赖于 I E,但确实减轻了 We b服务器的负担,并且给用户带来了更多的灵活性,因为他们可以选择自己所看到的数据格式。
11.4 相关的领域围绕着 X M L还有许多没有定义标准的领域,但仍然被各种各样的委员会使用着:
X S L仍然在发展,目前还不是一个标准。一旦它成为一个标准,将来的浏览器肯定会加入对 X S L的支持。
可扩展的超文本标记语言 (Extensible HyperText Markup Language,X H T M L )应该是一种第 11章 使用 X M L数据 计计 371下载
H T M L。 X M L与 H T M L最大的区别是严格程度不一样。 H T M L中的某些元素不一定需要一个关闭元素 (比如,L I和 B R元素 ),并且某些属性也并不需要用引号引起来。而 X M L
在这方面要求非常严格,所有的元素都必须有关闭标记,同时所有的属性都要用引号引起来。 X H T M L只是将这些字符串规则应用到 H T M L中。这样做的目的,首先是提高了标准化的程度,另外也就意味着 X H T M L文件可以很容易地被 X M L解析器处理,因为它遵循了 X M L的语法规则。 X H T M L主要依据 HTML 4.01版本,4,0 1版本增加了许多功能。
X L i n k和 X P o i n t e r是允许链接 X M L文档的 X M L扩展。 X L i n k与 H T M L中的 < A >标记的功能基本相同。 X P o i n t e r能够链接一个目标资源的单个或多个位置,每一个位置可以是文档的任何部分。这扩展了现有的链接模式的功能,同时也提供了一个更灵活的、有效的解决方案。
格式化对象是 X S L样式规范的第二个组成部分,它引入了一套标准标记用来格式化对象。
它们提供了一个与显示无关的格式化描述,这与 H T M L中描述和布局相结合的元素正好相反。
B i z Ta l k是微软设计的用来统一使用 X M L的框架。它定义了一套标准的专门用于解决一般的业务逻辑方案的 X M L标记。如需要更多的有关 B i z Ta l k的信息,请查询网址
h t t p,/ / w w w,b i z t a l k,o rg。
11.5 用于 SQL Server的 X M L技术预览就在本书送去印刷之前,微软发布了一个关于如何从 SQL Server中检索 X M L数据的技术预览,称为用于 SQL Server的 X M L技术预览,它采用一种位于 We b服务器和 SQL Server之间的 ISAPI DLL的形式。这个 D L L可以将 S Q L查询转换为 X M L,也能将 X M L复原回 S Q L数据。
这个 D L L的灵活性相当高,功能也极为强大。
该技术的一些特征包括以下几个方面:
以行格式 (由 A D O使用 )和元素格式提取 X M L。
可以包含一个带有 X M L数据的 D T D。
可以包含一个带有 X M L数据的模式。
可以通过 X M L插入、删除和更新数据。
既然还只是一个预览,这里不打算做详细的分析,但这确实很令人兴奋,这给未来 X M L
的发展带来了极大的希望,同时也使我们能更容易地使用 X M L数据。只需要使用这个工具,
就可以在浏览器中看到图 11 - 1 2所示的结果。
它依赖于一个由 Technology Preview注册工具建立的名为 N o r t h w i n d的虚拟目录。它创建这个虚拟目录,确保 ISAPI DLL处理所有进入该目录的请求。它能够处理 S Q L命令,并将其发送给 SQL Server,然后返回格式化为 X M L的 S Q L数据。如果不喜欢这种 X M L格式,而希望使用一种更传统的基于元素的布局,那么只需在查询的最后加上,e l e m e n t s”,显示结果如图 11 -
1 3所示。
正如在本章前面所见的那样,我们已经尝试了在 A S P中使用 A D O来创建数据岛,但是却碰到了许多困难。微软开发的这个新工具使我们可以做到这一点:
372计计 ASP 3 高级编程 下载图 11-12 在浏览器中显示的 X M L数据结果 1
图 11-13 在浏览器中显示的 X M L数据结果 2
这里不打算详细叙述这个问题。这有两个理由:首先,这是一个很新的内容;其次,相关内容可能会发生变化。然而,从某些未来的微软技术中我们看到了所期望的内容。
如果想下载关于该技术预览的拷贝,可以从 M S D N的站点下载,其网址是,m s d n,
m i c r o s o f t,c o m / w o r k s h o p / x m l / a r t i c l e s / x m l s q l / d e f a u l t,a s p。该文件的大小不超过 2 5 0 K B,因此不用很长时间就可以得到这个文件。
11.6 小结本章以很快的速度研究了实际上非常大的一个领域的内容,而且该领域正在日新月异地发展。 X M L为数据交互提供了巨大的潜力,X M L可能将出现在许多新的领域里。
毫无疑问你将越来越多地看到 X M L。因此,本章主要讨论了 X M L的一些基本问题,以及对于我们来说 X M L意味着什么。本章主要讨论了以下的内容:
XML是什么及它与数据之间如何联系。
ADO与 X M L之间如何交互。
在 A D O和 X M L之间如何使用 S t r e a m对象传输记录集。
如何使用 X S L将 X M L数据转换成 H T M L。
我们知道一些微软技术相互之间结合得不是太好。这也是可以预料的,因为这些技术是第 11章 使用 X M L数据 计计 373下载由不同的人员花费不同的时间开发的。但这给我们的编程带来了一定的困难。本章的任务之一就是向读者展示应用相应的技术能够做那些工作,这可以使读者花费较少的时间了解这方面的内容。虽然听起来让人有些沮丧,但是微软在其各种技术之间的结合方面不断进行着改进。相信不久的将来,其各种产品会以统一的方式工作,而不是同时提供多种解决方案。
我们已经花费了一些时间对一些领域的内容进行简单的探讨。这种探讨之所以肤浅的,
部分原因是这实在是一个很大的题目,另外的原因是该领域还在发展之中。但是也不要产生误解,X M L还是有必要掌握的。
374计计 ASP 3 高级编程 下载