XML的嵌套處理
一般情況下,我們從數(shù)據(jù)庫(kù)中查詢得到的結(jié)果集可能很大,所以從服務(wù)器返回到客戶端時(shí),數(shù)據(jù)會(huì)被分成若干個(gè)頁(yè)面分別進(jìn)行傳遞。此時(shí),利用TABLE元素中的DATAPAGESIZE屬性可以指定每個(gè)頁(yè)面包含記錄集條目的個(gè)數(shù)。
例如:
TABLE DATASRC=“#xmldso” DATAPAGESIZE=10>
很顯然,如果XML數(shù)據(jù)格式是對(duì)稱的,則無(wú)論是映射到ADO記錄集還是綁定到表格元素上,效果都會(huì)很好。而在實(shí)際應(yīng)用中,XML數(shù)據(jù)為非對(duì)稱的例子也很多,比如一本書的作者可能就不止一位,這在映射和綁定時(shí)都會(huì)產(chǎn)生一定的麻煩。解決問(wèn)題的辦法就是利用嵌套。每一行表格仍對(duì)應(yīng)一條主元素,每一欄也對(duì)應(yīng)著一個(gè)子元素。對(duì)于重復(fù)元素,則使用嵌套的表格。我們假設(shè)在books.xml中,第一本書的作者為Dean Straight,第二本書的作者為Charlotte Cooper、Shelley Burke和Regina Murphy。此時(shí),綁定過(guò)程如下:
● 創(chuàng)建TABLE元素,并將數(shù)據(jù)島ID賦值給DATAFLD屬性;
● 對(duì)于單獨(dú)的XML元素,如isbn>,創(chuàng)建TD元素,并設(shè)定相應(yīng)的DATAFLD屬性;
● 對(duì)于重復(fù)元素,在TD元素內(nèi)部嵌套一個(gè)表格;
● 用單行單列的形式顯示作者信息。
注意這里的DATAFLD屬性必須設(shè)定為“$TEXT”,
以保證嵌套元素的內(nèi)容被全部顯示在指定的元素中。
完整的HTML代碼如下所示:
TABLE BORDER=1 DATASRC=“#xmldso”>
THEAD>TR>TH>Title/TH>
TH>ISBN/TH>
TH>Author/TH>/TR>/THEAD>
TBODY>
TR>TD>
DIV DATAFLD=“title”>/DIV>/TD>
TD>DIV DATAFLD=“isbn”>
/DIV>/TD>
TD>
TABLE BORDER=0 DATASRC=“#xmldso” DATAFLD=“author”>
TR>TD>SPAN DATAFLD=“$Text”>/SPAN>/TD>/TR>
/TABLE>
/TD>
/TR>/TBODY>
/TABLE>
事實(shí)上,使用DSO效果最好的情況是針對(duì)結(jié)構(gòu)對(duì)稱的數(shù)據(jù),而處理非對(duì)稱數(shù)據(jù)更有效的辦法是使用我們以后將要介紹的DOM技術(shù)。
DSO技術(shù)的應(yīng)用
1. 訪問(wèn)元素的屬性
用DSO訪問(wèn)元素的屬性很簡(jiǎn)單,可以直接把屬性按子元素來(lái)處理。
例如:
book isbn=“9-001-122-12”>
……
/book>
這樣,在綁定到HTML表格中時(shí),就可以直接按子元素來(lái)處理:
TD>SPAN DATAFLD=“isbn”> /SPAN>/TD>
如果遇到屬性名和子元素名一樣的情況,在元素名前加上“!”進(jìn)行區(qū)分。 2.遍歷記錄集
DSO把XML數(shù)據(jù)島當(dāng)做ADO記錄集進(jìn)行處理的一大好處是可以利用ADO提供的各種方法對(duì)數(shù)據(jù)源進(jìn)行訪問(wèn),尤其是當(dāng)把數(shù)據(jù)島與類似SPAN、DIV和INPUT等HTML元素綁定時(shí)。通常這些元素顯示的是記錄集的首條記錄,要想對(duì)記錄集進(jìn)行遍歷瀏覽,可以使用ADO的方法 : Move、MoveFirst、MoveLast、MoveNext和MovePrevious。比如創(chuàng)建一個(gè)按鈕響應(yīng)函數(shù),只要用戶點(diǎn)擊“Next”按鈕,就可以逐條瀏覽相應(yīng)的記錄。
例如:
XML ID=“xmldso” SRC=“books.xml”>
/XML>
Sub btnNext_onclick()
xmldso.RecordSet.MoveNext
End Sub
3.與Script語(yǔ)言相結(jié)合
有些用戶比較習(xí)慣編寫Script語(yǔ)言,利用DSO技術(shù)同樣可以與各種Script很好地結(jié)合在一起。
例如(以VB Script為例),訪問(wèn)記錄集時(shí),代碼如下:
Dim rsBooks
Set rsBooks = xmldso.RecordSet
訪問(wèn)字段(子元素)的值:
Dim sTitle
sTitle = rsBooks(“title”)
可以使用innerText和innerHTML屬性把得到的值傳遞給HTML元素。例如,有一個(gè)DIV元素名為divTitle,賦值代碼如下所示:
divTitle.innerTEXT = sTitle
利用腳本程序還可以處理許多DSO事件,下表列舉了其中的一部分事件:
在腳本中處理各種事件的方法就是在SCRIPT>標(biāo)簽中使用FOR屬性指定XML數(shù)據(jù)島ID,使用EVENT屬性確定事件類型。
例如,獲取記錄集中條目的個(gè)數(shù):
SCRIPT Language=“VB Script” FOR=“xmldso” EVENT=“onDataAvailable”>
lblRecords.value = booklist.RecordSet.RecordCount
/SCRIPT>
除了顯示記錄數(shù)據(jù)之外,腳本程序還可以對(duì)記錄集進(jìn)行快速查詢、排序、編輯等操作。但要指出的是,雖然ADO技術(shù)中提供了類似SortColumn和SortAscending等方法對(duì)XML數(shù)據(jù)進(jìn)行排序,但是效果不如XSL中的排序操作,所以建議大家充分利用XSL技術(shù)來(lái)實(shí)現(xiàn)這部分功能。
其余的功能,如利用腳本對(duì)記錄集進(jìn)行諸如增加、刪除、修改等操作,或是分頁(yè)顯示HTML表格等等,在這里就不一一舉例說(shuō)明了,用法與前面的操作大同小異。最后需要說(shuō)明的是,所有對(duì)DSO對(duì)象的操作都是在用戶端完成的,實(shí)際上是服務(wù)器數(shù)據(jù)對(duì)象的一份復(fù)制品,這樣做的好處是避免了網(wǎng)絡(luò)承受大量數(shù)據(jù)通信的負(fù)擔(dān)。但這時(shí)用戶端所做的任何操作對(duì)服務(wù)器上存儲(chǔ)的數(shù)據(jù)毫無(wú)影響,如果要想對(duì)服務(wù)器記錄也進(jìn)行修改,那么就要用到客戶端與服務(wù)器端的數(shù)據(jù)交換技術(shù),我們將在以后對(duì)此進(jìn)行介紹。