快速表列资料-资料系结
在上一期的文章中我们介绍了使用ADO从资料库取出资料转换成为XML,并利用XSL技术将之展现在网页上。渐渐地整合各种XML应用技术,在这一期将介绍透过资料系结技术,轻松快速地表列资料。
谈到资料系结,它到底有什么好处呢?首先第一点它使用上直觉、简单,第二点它不需撰写大量的程式即可达到资料展现的目的,第三点它维护轻松、容易修改,主要是因为资料与展现的HTML标签分离。接下来就这三点来讨论资料系结如何应用吧!
资料系结
首先如果要使用资料系结技术来展现资料,必须要在网页中建立XML的资料来源物件(Data Source Object),文中简称DSO,建立DSO的方式有两种,第一种是使用Java Applet连结到一份Books.xml档案资料,范例如下:
< HTML >
< HEAD >
< APPLET CODE="com.ms.xml.dso.XMLDSO.class"
id="xmldso" width=0 height=0 >
< PARAM NAME="URL" VALUE="Books.xml" >
< /APPLET >
< /HEAD >
< BODY >
< /BODY >
< /HTML >
JavaApplet.htm
第二种方式是建立XML DataIsland(XML资料岛),范例如下:
< HTML >
< HEAD >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >
< /BODY >
< /HTML >
XMLDataIsland1.htm
或者直接将XML资料崁入DataIsland中,范例如下:
< HTML >
< HEAD >
< xml id="xmldso" >
< ?xml version="1.0"? >
< booklist >
< book >
< title >The Gourmet Microwave< /title >
< isbn >72-80081-082< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
< /booklist >
< /xml >
< /HEAD >
< BODY >
< /BODY >
< /HTML >
XMLDataIsland2.htm
这两种方式都能建立DSO,不过第二种方式,也就是XML DataIsland的语法只有在IE5以后的版本才有支援,在这边预设读者都有IE5可以测试。建立好DSO,先看一下DSO里面的资料,也就是连结到的XML档案Books.xml,如下列档案内容:
< ?xml version="1.0"? >
< booklist >
< book >
< title >The Gourmet Microwave< /title >
< isbn >72-80081-082< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
< book >
< title >Sushi, Anyone?< /title >
< isbn >72-80081-024< /isbn >
< publisher >New Moon Books< /publisher >
< price >14.99< /price >
< details >Details.asp?isbn=72-80081-024< /details >
< author >Charlotte M. Cooper< /author >
< author >Yoshi Nagase< /author >
< /book >
< book >
< title >The Busy Executive‘‘s Database Guide< /title >
< isbn >9-001-122-12< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >19.95< /price >
< details >Details.asp?isbn=9-001-122-12< /details >
< author >Mayumi Ohno< /author >
< /book >
< book >
< title >Cooking With Computers: Surreptitous Balance Sheet< /title >
< isbn >9-001-122-90< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >11.95< /price >
< details >Details.asp?isbn=9-001-122-90< /details >
< author >Mayumi Ohno< /author >
< author >Ian H. Devling< /author >
< author >Peter Wilson II< /author >
< author >Lars Peterson< /author >
< /book >
< book >
< title >Straight Talk About Computers< /title >
< isbn >9-001-122-01< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >19.99< /price >
< details >Details.asp?isbn=9-001-122-01< /details >
< author >Lars Peterson< /author >
< /book >
< /booklist >
XML档案中包含五本书,每本书都有一个以上的作者。接下来要如何让HTML标签来展现资料呢?其实很简单,例如下面的范例,仅仅在标签内加上两个属性设定(datasrc与datafld),第一笔资料就能够系结在标签内了:
< HTML >
< HEAD >
< xml id="xmldso" src="Books.xml" > < /xml >
< /HEAD >
< BODY > 书号:< span datasrc="#xmldso" datafld="isbn" >< /span >< br >
书名:< TEXTAREA rows=2 cols=20 id=textarea1 name=textarea1 datasrc="#xmldso" datafld="title" >< /TEXTAREA >< br >
出版商:< INPUT type="button" value="Button" id=button1 name=button1 datasrc="#xmldso" datafld="publisher" >< br >
价格:< INPUT type="text" id=text1 name=text1 datasrc="#xmldso" datafld="price" >
< /BODY >
< /HTML >
DataIsland3.htm
结果图如下:
原来datasrc属性就是指定DSO,而datafld就是指定栏位,并且个别用不同的标签来展现,读者就会发现资料系结的弹性以及方便了。例如价格栏位资料会系结到TextBox的Value属性,所以结果可以看到资料便展现在TextBox里面。
但是有一点必须要注意,并不是所有的HTML标签都支援这两个属性,在以下的表格中列出支援的HTML标签以及资料系结后所对应的标签属性:
HTML标签 资料系结标签属性
A href
APPLET property value via PARAM
BUTTON innerText, innerHTML
DIV innerText, innerHTML
FRAME src
IFRAME src
IMG src
INPUT TYPE=BUTTON innerText, innerHTML
INPUT TYPE=CHECKBOX checked
INPUT TYPE=HIDDEN value
INPUT TYPE=PASSWORD value
INPUT TYPE=RADIO checked
INPUT TYPE=TEXT value
LABEL innerText, innerHTML
LEGEND innerText, innerHTML
MARQUEE innerText, innerHTML
SELECT obj.options(obj.selectedIndex).text
SPAN innerText, innerHTML
TEXTAREA value
如上表span标签在设定完datasrc及dtafld之后,资料会存放在标签的innerText或innerHTML属性中,这代表资料能够以TEXT纯文字展现或以HTML展现。资料系结之后预设使以纯文字展现,也就是存放在innerText属性,例如改写Books.xml的第一笔资料的isbn栏位如下:
< book >
< title >The Gourmet Microwave< /title >
< isbn > < B < 72-80081-082 < /B < ;< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
其中‘<’代表‘< ’符号,‘&glt;’代表‘ >’符号,主要是因为XML资料中大于和小于符号是保留字,所以必须以其他方式表现,此时再度执行DataIsland3.htm会得到以下结果:
但是这不是想要的结果,主要的目的是希望书号栏位资料以粗体展现,此时必须配合另一个HTML属性,也就是修改DataIsland3.htm的span标签,再加上一个属性dataformatas设定为HTML。此时资料系结后,资料便会存放在span标签的innerHTML属性,也就是以HTML方式展现,如下程式码及结果:
书号:< span datasrc="#xmldso" datafld="isbn" dataformatas="HTML" >< /span >< br >
浏览资料
到目前为止,虽然资料系结很方便看到所需的资料,但是都只能看到第一笔,所以应该要有浏览的机制,也就是加上可以切换上下笔的功能。首先在页面上放进四颗按钮并给定按钮文字内容,然后加上被点选后所执行的程式如下:
< HTML >
< HEAD >
< META name=VI60_defaultClientscript content=VBscript >
< META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0" >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< script ID=clientEventHandlersVBS LANGUAGE=vbscript >
< !--
Sub button2_onclick xmldso.recordset.movefirst
End Sub
Sub button3_onclick xmldso.recordset.moveprevious
if xmldso.recordset.bof then
xmldso.recordset.movefirst
end if
End Sub
Sub button4_onclick xmldso.recordset.movenext
if xmldso.recordset.eof then
xmldso.recordset.movelast
end if
End Sub
Sub button5_onclick xmldso.recordset.movelast
End Sub
-- >
< /script >
< /HEAD >
< BODY >
书号:< span datasrc="#xmldso" datafld="isbn" dataformatas=HTML >< /span >< br >
书名:< TEXTAREA rows=2 cols=20 id=textarea1 name=textarea1 datasrc="#xmldso" datafld="title" >< /TEXTAREA >< br >
出版商:< INPUT type="button" value="Button" id=button1 name=button1 datasrc="#xmldso" datafld="publisher" >< br >
价格:< INPUT type="text" id=text1 name=text1 datasrc="#xmldso" datafld="price" >< br >
< INPUT type="button" value="第一笔" id=button2 name=button2 >
< INPUT type="button" value="上一笔" id=button3 name=button3 >
< INPUT type="button" value="下一笔" id=button4 name=button4 >
< INPUT type="button" value="最后一笔" id=button5 name=button5 >
< /BODY >
< /HTML >
DataIsland3.htm
上面的程式中会将XML资料模拟成RecordSet,此时就可以透过RecordSet的Method来浏览资料。不过如果想要同时浏览多笔资料又该如何?这时可以使用Table标签来做资料系结,如以下方式:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >
< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso >
< THead >
< TD >书号< /TD >< TD >书名< /TD >< TD >价格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >< span datafld=author >< /span >< /TD >
< /TR >
< /TABLE >
< /BODY >
< /HTML >
结果如下:
但是由于每一笔资料有多个作者栏位资料,所以资料系结的方式必须稍作修改,以槽状结构来系结资料:
< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso >
< THead >
< TD >书号< /TD >< TD >书名< /TD >< TD >价格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >< span datafld="$Text" >< /span >< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >
结果如下:
既然能够浏览多笔资料,最好能加上换页功能,而做法只要再配合两个属性-Table标签的id及datapagesize属性,以及简短的程式就可以达成,范例如下:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< script ID=clientEventHandlersVBS LANGUAGE=vbscript >
< !--
Sub button1_onclick
Table1.previousPage
End Sub
Sub button2_onclick Table1.nextPage
End Sub
-- >
< /script >
< /HEAD >
< BODY >
< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso id=Table1 datapagesize=2 >
< THead >
< TD >书号< /TD >< TD >书名< /TD >< TD >价格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >< span datafld="$Text" >< /span >< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >
< INPUT type="button" value="上一页" id=button1 name=button1 >
< INPUT type="button" value="下一页" id=button2 name=button2 >
< /BODY >
< /HTML >
DataIsland4.htm
结果如下:
资料系结小技巧
对于资料系结也有许多小技巧,例如提供超连结、跑马灯的效果或者TextBox系结提供编修资料的功能,范例如下:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >
< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso id=Table1 datapagesize=2 >
< THead >
< TD >书号< /TD >< TD >书名< /TD >
< TD >价格< /TD >< TD >出版商< /TD >
< TD >作者< /TD >
< /THead >
< TR >
< TD > < span datafld=isbn dataformatas=HTML >< /span > < /TD >
< TD > < a datafld=details >< span datafld=title >< /span >< /a >< < /TD >
< TD > < MARQUEE datafld=price >< /MARQUEE > < /TD >
< TD > < INPUT type="text" id=text1 name=text1 datafld=publisher > < /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >
< font color=red > < span datafld="$Text" >< /span > < /font >
< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >
< /BODY >
< /HTML >
DataIsland4.htm
结果如下:
结 论
看过了以上几个范例,读者会真正了解本文第一段所谈到资料系结的好处,使用上极为简单易用。不过应用方式及小技巧不少,如果能妥善运用,对于资料的展现以及维护都会比使用ASP.NET和HTML标签混杂的程式容易许多。
虽然展现快速容易,但是仍然有不足的地方,也就是弹性较小。如果想要做到更复杂的功能则就很困难,例如想要根据栏位内容来做排序,这就要另外结合XSL技术或ASP.NET技术重新查询资料库。如果不需要复杂的功能,上面的这些范例就能够解决掉大部分只需简单展现的页面。
在下一期的文章中会再结合XML的魔法师XML DOM(XML Document Object Model),完全整合这四期文章的技术,让XML充满无限的变化。