2004年12月23日

基于Web的XML数据搜索与查询

李 元 
01-10-15 下午 12:16:13

——————————————————————————–
 

使用XML数据源对象DSO(Data Source Object)可把HTML元素绑定到XML数据集,在客户(浏览器)端使用VBScript,JavaScript以及更新的C#与VB7等编写代码对XML数据进行处理,包括对XML数据进行搜索与查询。对于微软的IE5.0以上浏览器,可以在HTML页中用标记<XML>将XML元素直接嵌入在<XML>与</XML>之间使用,也可以利用<XML>标记的SRC属性将XML数据文挡作为外部文挡使用,作为外部文件使用的优点是:XML数据传到了客户的机器的缓冲区,但是在HTML页面文件上看不见,通过存盘也得不到,在一定程度上保护了原始数据。
本文以“唐诗300首查询”为例,设计一个XML文挡(ts300.xml)和一个HTML页面(ts300.html),在页面里通过<XML>标记的SRC属性将XML数据文挡ts300.xml作为外部文挡使用,用VBScript编写代码实现对唐诗300首的浏览、查询;浏览ts300.html的效果如下:
 
 
(1)唐诗300首XML文挡ts300.xml:
 
《唐诗300首》由300首唐诗组成,每首唐诗由诗名、作者和诗句组成,作成它的XML文挡时,对每首诗增加编号和图片(下面列出一首):
 
<?xml version=”1.0″ encoding=”GB2312″ standalone=”yes”?>
<ts300>
<poem>
<bh>013</bh>
<author>王维</author>
<title>送别</title>
<text>下马饮君酒,问君何所之。君言不得意,归卧南山陲。但去莫复闻,白云无尽时。</text>
<picture>images/002.gif</picture>
</poem>
 
</ts300>
 
(2)HTML页面ts300.html
 
页面首先使用:
 
<xml src=”ts300.xml” id=”TS300″></xml> 
 
将上面设计的XML文挡ts300.xml引入,并将其标识为TS300,页面上的VBScript代码通过这个标识处理ts300.xml中的数据:每首诗(即<poem>与</poem>间的内容)是一条记录(Recordset),每条记录中的一款是一个字段(Fields),因此:
 
TS300.recordset.Fields(“author”)
 
得到唐诗300首(ts300.xml)当前记录下(一首诗)的作者;页面用VBScript定义了下列函数来对XML数据进行交互处理:
 
(1)Display() : 在各文本框里分别显示当前记录的XML数据:作者、诗名与诗句
(2)Search0() : 顺序浏览XML纪录
(3)Search1() : 按用户输入的作者名进行查询(每次查询从第一条记录开始),找到有关记
录后调用Display显示
(4)Search2() : 按选择框的内容查询,找到有关记录后调用Display显示
 
页面完整代码如下,其中用CSS样式语句设置文本框的字体字号和颜色:
 
<xml src=”ts300.xml” id=”TS300″></xml>
<center><font color=red><h1>基于XML的唐诗三百首查询</h1></font></center>
<BODY background=”b01.gif”>
<style type=’text/css’>
<!–
body,input {font-size :12pt;color=blue}
TEXTAREA {font-size :12pt;}
–>
</style>
 
<script language=”vbscript”>
<!–
 
Sub Display() 
‘各文本框将显示当前记录XML数据
sj.value=TS300.recordset.Fields(“text”)
zz.value=TS300.recordset.Fields(“author”)
sm.value=TS300.recordset.Fields(“title”)
End Sub
 
Sub Search0()
‘记录指针指向下一条纪录
If (Not TS300.Recordset.EOF) Then 
TS300.Recordset.MoveNext
Else
TS300.Recordset.MoveFirst
End If 
‘调用Display(),各文本框将显示当前记录XML数据
Display
End Sub
 
 
Sub Search1() ‘作者查询
‘每次查询从第一条记录开始
Do 
If TS300.recordset.Fields(“author”)=zzcx.value Then
EXIT Do
End if 
If (Not TS300.Recordset.EOF) Then 
TS300.Recordset.MoveNext
Else
EXIT Do
End If
Loop
 
IF TS300.recordset.Fields(“author”)<>zzcx.value Then
Search0
MsgBox(“没查到!”)
 
Else
MsgBox(“查到!”)
Display
End If
End Sub
 
 
Sub Search2() ‘选择查询
‘每次查询从第一条记录开始
TS300.Recordset.MoveFirst
‘如果XML记录中字段author的名字与选择栏名字不同,往下移动一条记录
Do 
If TS300.recordset.Fields(“author”)=gdcx.value Then
EXIT Do
End if 
If (Not TS300.Recordset.EOF) Then 
TS300.Recordset.MoveNext
Else
EXIT Do
End If
Loop
 
If (Not TS300.Recordset.EOF) Then
MsgBox(“查到了!”)
Display
End If
End Sub
–>
</script>
<!–安置文本框 –>
<pre>
键入作者名查询: <input name=”zzcx”>
选择作者名查询: <select name=”gdcx”>
<option value=”张九龄”>张九龄
<option value=”李白”>李白
<option value=”杜甫”>杜甫
<option value=”王维”>王维
</select>
<hr><center><font color=blue><h2>查询结果:</center></font></h2>
 
诗 名: <input name=”sm”>
作 者: <input name=”zz”> 
诗 句: <TEXTAREA name=”sj” ROWS=3 COLS=48> </TEXTAREA>
 
</pre>
<center><table> <!–安置按纽,建立按纽事件调用 –>
<td><input type=”button” value=”作者查询” onClick=”Search1″ ></input></td>
<td><input type=”button” value=”选择查询” onClick=”Search2″ ></input></td>
<td><input type=”button” value=”浏 览” onClick=”Search0″ ></input></td>
</table></center>