[返回]
计算机世界2002年第20期XML技术优化网络资源
华中科技大学 李锋、魏莹
大多数有一定规模的Web网站的数据内容都存放在数据库或数据文件中。用户如果需要浏览和获取所需的数据内容,必须下载或拷贝数据文件(.html页面)。而且,为了得到自己所需的数据内容和格式,用户还必须对数据文件进行再整理,甚至需要重新生成可用的数据文件。同时,对于数据提供者来说,要么只提供单一的、仅供用户浏览的数据文件页面,要么为了满足不同用户的千差万变的需求而提供各种格式的数据文件下载(.zip、.xls等文件)。采用这些方法都存在着不同程度的对资源的浪费,其中主要是服务器资源、网络信道资源、客户机资源。
如果能将“原始的”数据内容与数据的显示格式分离开来,将会在一定程度上节约网络资源:数据提供者提供“裸”数据和各种不同格式的数据浏览、处理程序供下载(后者可选);而用户只需要下载“裸”数据,采用下载的或者是自己定制的数据格式浏览、处理程序处理数据,满足自己的需求。XML技术可以极大地满足用户这一需求,并且可以跨平台使用。
XML简介
XML(Extensible Markup Language,可扩展标记语言)是SGML的一个简化子集,它将SGML的丰富功能与HTML的易用性结合到Web应用中,以一种开放的自我描述方式定义数据结构,在描述数据内容的同时能突出对结构的描述,从而体现出数据之间的关系。
XML的最大优点在于它的数据存储格式不受显示格式的制约。一般来说,在创建文本时,需要时时考虑输出格式,如果因为需求不同而需要对同样的内容进行不同风格的显示时,要从头创建一个全新的文档,重复工作量很大。然而,XML将显示格式从数据内容中独立出来,保存在样式单文件(XSL)中,这样如果需要改变文档的显示方式,只要修改样式单文件就行了。
XML解析器DOM(Document Object Model)可以将XML文件或对象一次性解析,生成一个位于内存的对象树描述该XML文件或对象。并且,DOM是一种与平台和语言无关的接口,它允许程序和脚本动态访问和修改文档的内容、结构和类型。利用DOM,开发人员可以动态地创建XML、遍历文档、删改文档内容。DOM提供的API与编程语言无关,对一些DOM标准中没有明确定义的接口,不同解析器的实现方法可能有些差别。本文介绍的方法均指采用MS XML的DOM方案,并用VBScript脚本编写代码。
关键技术
XML技术不是面向数据显示的,它是一种格式转换技术,在显示手段和方式上不及HTML那样丰富。一种理想的解决方案是把HTML和XML两种技术相结合,优势互补,使真正的原始数据在能够保持本来意义和结构的同时,还能充分利用HTML多样的显示功能。XML数据岛就是这种技术融合的产物,它使用XML标签把XML数据直接嵌入到HTML页面中,从而实现两者的优势互补。
IE 5把XML数据岛作为一种特殊的ADO记录集进行处理。DSO(Data Source Objects)把XML数据岛当做ADO记录集进行处理的一大好处是可以利用ADO提供的各种方法对数据源进行访问,例如想对记录集进行遍历浏览,可以使用ADO的各种方法: Move、MoveFirst、MoveLast、MoveNext和MovePrevious等。
软件实现
这里以一个例子实现并验证采用XML技术的实际效果。具体方法是从数据库中动态读取一个表的所有数据,存储在XML文件中供用户下载。用户下载该XML文件,并采用VBScript脚本程序解析数据,将数据存放在一个Excel文件中。
//动态生成XML文件的ASP脚本程序
<%@ Language=VBScript %>
<% Set Conn=Server.CreateObject(“ADODB
.connection”) %>
<% Set rs=server.CreateObject(“ADODB
.recordset”) %>
<% Conn.open Application(“SQLserverConn”) %>
//从数据库中动态提取所需要的数据
<% sqlText=“select * from YearData” %>
<% set rs=conn.Execute(sqlText) %>
<% rs.MoveFirst %>
//将数据写入XML对象中
<?xml version=“1.0” ?>
<Months>
<% do while not rs.EOF %>
<Month>
<% for i=0 to rs.Fields.Count-1 %>
<<%=rs.Fields(i).Name %>><%=rs
.Fields(i).Value %></<%=rs.Fields(i).Name %>>
<% next %>
<% rs.MoveNext %>
</Month>
<% loop %>
</Months>
<% rs.Close %>
<% set rs=nothing %>
<% conn.Close %>
<% set conn=nothing %>
用户下载该XML文件后,应用程序从XML文件中读取数据,并存储在一个Excel文件中。该VBScript脚本程序关键代码如下:
<HTML>
<HEAD>
<script language=vbscript>
Sub SaveAsExcel_onClick
//获得XML数据岛对象的DSO数据对象
Set rs=YearData.RecordSet
Rs.MoveFirst
//实例化一个Excel对象
Set xlsApp=CreateObject(“Excel.Application”)
xlsApp.Visible=True
//添加一个工作簿
xlsApp.WorkBooks.Add
Set xlsWBook=xlsApp.ActiveWorkBook
//设定当前使用的工作单
Set xlsWSheet=xlsWBook.WorkSheets(1)
//用黑体字输出列名
for i=0 to rs.Fields.Count-2
xlsWSheet.Cells(1,i+1).value=rs.Fields(i).Name
xlsWSheet.Cells(1,i+1).font.Bold=True
next
//在Excel文件单元格中插入数据
j=1
do while not rs.Eof
j=j+1
for i=0 to rs.Fields.Count-2
xlsWSheet.Cells(j,i+1).Value=rs.Fields(i).Value
next
rs.MoveNext
loop
rs.Close
set rs=nothing
//将生成的Excel文件存盘
xlsWBook.Close True,“newbook.xls”
//退出Excel
xlsApp.Quit
Set xlsWSheet=nothing
Set xlsWBook=nothing
Set xlsApp=nothing
End Sub
</script>
</HEAD>
<BODY>
<XML ID= “YearData” SRC= “YearData
.xml” ></XML>
<form>
<input type=button name=“SaveAsExcel” value=“存成Excel文件”>
</form>
</BODY>
</HTML>
以一个有19个字段的数据表为例,该数据库表中共存放有13条记录,如果将该数据记录存放在Excel文件中,并提供给用户下载,则产生一个15360字节的Excel(Office 2000)文件;如果使用ASP脚本在客户端生成XML数据岛,该ASP脚本源代码为644字节,而在客户端产生的XML文件大小为6849字节,客户端采用VBScript脚本动态生成Excel文件,该脚本文件大小为846字节。
采用Excel文件下载与采用XML技术的方式进行比较: 在服务器端,两种方法占用存储介质之比为:23.851∶1;在客户端,两种方法所需通信数据量之比为:2.243∶1。明显地看出,采用XML技术存储数据内容,并在客户端解析数据(用户定制显示格式),对服务器以及通信资源的占用率大大降低。
结论
Web应用中采用XML技术,一方面我们可以通过分布式计算,减轻服务器负荷(数据的解析在客户端完成),降低网络通信中对信道带宽的需求,另一方面,可以对用户更为彻底地屏蔽后台数据库资源的异构性,提供统一的数据接口,好处不言而喻。