曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
包含输入和输出功能。当讨论D O M在服务器端的应用时,我们将看到如何使用纯粹的D O M
Level 1功能产生X M L文件。
我们将d i v R a w X M L元素的文本(位于文件底部)设置为普通的文本输出。然后,我们使用
样式表将X M L文档转化为可读性更强的输出。第9章将详细介绍X S L。
最后,我们列出了三个内嵌的样式表,以及H T M L 页面的其余部分,其中包含
r e n d e r E l e m e n t ( )函数涉及的D I V元素:
程序清单5 - 1 3
第5章文档对象模型使用131 下载
132使用XML 高级编程
下载
通过这种方式在客户端创建的X M L文档能够传回服务器端进行操作,虽然这超出了本例的
讨论范围。最简单的方法是设置输入元素,它通常是隐含的,它的值是文档的x m l属性的值;当
表单被提交时,这些信息将成为提交元素的一部分。如果客户端的X M L文档过大,不适于作为
表单的一部分提交,可以考虑其他方式,例如: F T P,使用Posting Acceptor 的H T T P,其他
H T T P文件提交程序,x m l h t t p事务(M i c r o s o f t特有的结构),或者M i c r o s o f t的S O A P协议(第1章
讨论了S O A P协议)等。
5.3.2 更复杂的编程实例
下面让我们看看如何将D O M应用于服务器端。我们将构建一个A S P页面,它通过P o s t i n g
A c c e p t o r接收客户端提交的固定宽度的文本文件,然后解析文件并使用D O M建立数据岛,最后
将结果发送回客户端。
1. 使用D O M根据文本创建X M L文档
在这个例子中,用户不必通过H T M L页面输入图书的数据,我们已经有代表图书的固定宽度
的文本文件。假设它已经通过某种机制( F T P、Posting Acceptor或其他任何方法)上载到服务
器的/ u p l o a d s目录。A S P页面将解析上载的文件,在H T M L页面中产生数据岛,并将页面发送回
客户端供用户查看。
你可以通过Wr o x的We b站点h t t p : / / w w w. w r o x . c o m获得本节实例的代码文件。
我们将提交的图书文件如下:
程序清单5 - 1 4
第5章文档对象模型使用133 下载
这是一个固定宽度的文件,许多遗留的系统仍然使用这类文件导出数据。文件的第一行包
含书名、出版商和出版日期;第二行包含书的价格和I S B N号;第三行是书的摘要。文件的其余
部分列出了书的作者(以字母A开头的行)和类别(以字母C开头的行)。在实际应用中,产生
该文件的系统还应该提供用于描述文件格式和内容的文档。
我们将使用下面的表单B o o k F o r m . h t m请求解析该文件:
程序清单5 - 1 5
D i s p l a y B o o k . a s p文件如下:
为了能够在客户端看到利用样式表显示的结果,我们将使用前一节介绍的客户端实例中的
renderElement() JScript函数;然而,在本例中最重要的是如何解析文件。一旦解析了文件,就
很容易将它存储在关系数据库中,或者以其他形式保存。
程序清单5 - 1 6
下面,我们将实现几个辅助性子例程。第一个是A d d E l e m e n t To P a r e n t ( ),它将指定的元素和
值添加到指定的D O M中特定的父元素中:
程序清单5 - 1 7
134使用XML 高级编程
下载
第二个辅助子例程用于从D O M产生X M L流。需要说明的是, D O M的某些实现,例如:
M i c r o s o f t提供的实现,包含了用于产生这个文本的属性,然而由于这并不是Level 1要求的功能,
因此你使用的D O M实现可能不提供该属性,为此,必须使用如下子例程。另外,大多数节点类
型,例如:属性、注释等,是我们的例子无法处理的。我们将在后面重新分析这段代码,说明
如何导出其他节点类型。但是现在,这个子例程只能处理e l e m e n t和t e x t节点类型:
程序清单5 - 1 8
程序中的递归用于产生文件中的嵌套标记—当使用递归时,你应该特别注意堆栈问题。
然而,对于大多数X M L文档,这种技术是恰当的。
实际上,真正的文件解析操作是在将包含X M L的数据岛中执行的。一旦解析完毕,就可以
利用R e s p o n s e . Wr i t e生成X M L(在Wr i t e N o d e X M L ( )过程中),它将创建H T M L中的数据岛,这个
H T M L文件将返回给客户端:
程序清单5 - 1 9
第5章文档对象模型使用135 下载
在本例中,我们将文件名硬编码—但是在实际环境中,文件应该来自Posting Acceptor或
其他源:
然后,我们创建Microsoft XML DOM对象的实例,并将它设置为同步操作:
下面,我们创建B o o k元素,并将它添加到新文档中:
现在,我们将打开文件,并开始解析:
对于与图书相关的每条常规信息,我们使用A d d E l e m e n t To P a r e n t ( )子例程将适当的子元素添
加到B o o k元素中。该子例程将根据标记名称和数据创建元素节点和文本节点,并将它们链接到
一起,添加到指定的父节点中:
程序清单5 - 2 0
136使用XML 高级编程
下载
现在,文件中未处理的行分别对应于A u t h o r元素和C a t e g o r y元素。文件的第一列指示了哪些
代表作者,哪些代表类别—A表示作者,C表示类别。首先,我们需要产生R e c S u b j C a t e g o r i e s
和A u t h o r s容器元素,并将它们添加为B o o k元素的子节点:
程序清单5 - 2 1
下面,我们将读取文件的剩余行。对于每一行,先确定它是类别还是作者,然后将它添加
为适当容器元素的子节点:
程序清单5 - 2 2
下面,我们将向应答串中写入纯X M L。由于我们的代码是在数据岛中执行的,因此写入的
数据将嵌在数据岛中:
程序清单5 - 2 3
下面的三个样式表和H T M L代码片段选自第一个例子。唯一的变化是B O D Y元素现在包含
o n l o a d事件,它将使用三个样式表展示X M L数据岛:
程序清单5 - 2 4
第5章文档对象模型使用137 下载
138使用XML 高级编程
下载
D i s p l a y B o o k . a s p文件将产生如图5 - 9所示的输出。
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程上(54)