【轉(zhuǎn)載】Web Services&XML:XML與HTML的結(jié)合(數(shù)據(jù)島的應(yīng)用)
目前,許多Web網(wǎng)站的內(nèi)容數(shù)據(jù)都存放在數(shù)據(jù)庫或數(shù)據(jù)文件中。對于Web程序開發(fā)人員來說,如果要想把有用的信息從數(shù)據(jù)庫中提取出來,傳統(tǒng)的方法
是在服務(wù)器端編寫腳本程序(如VBScript、javascript、CGI、ASP、Perl等等),通過對數(shù)據(jù)庫執(zhí)行SQL查詢得到相關(guān)記錄,然后
把查詢結(jié)果組織成HTML頁面返回給客戶端,用戶使用瀏覽器觀察最終結(jié)果。
為了提高系統(tǒng)服務(wù)的靈活性、可擴展性,使服務(wù)對象范圍更
廣,許多商業(yè)網(wǎng)站都盡可能地把商務(wù)規(guī)則、原始數(shù)據(jù)和表現(xiàn)形式當(dāng)做相互獨立的服務(wù)分別提供。HTML那種蘊數(shù)據(jù)于顯示之中的方式顯然不合乎這種需求。因此,
把原始數(shù)據(jù)存放在XML文檔中,使用樣式單文件顯示內(nèi)容是XML技術(shù)適合于電子商務(wù)的優(yōu)勢所在。但從本質(zhì)上來說,XSL技術(shù)不是面向數(shù)據(jù)顯示的,它是一種
格式轉(zhuǎn)換技術(shù),在顯示手段和方式上都遠不及HTML那樣豐富。對編程人員來說,一種較為理想的方案是把HTML和XML兩種技術(shù)相結(jié)合,優(yōu)勢互補,使真正
的原始數(shù)據(jù)在能夠保持本來意義和結(jié)構(gòu)的同時,還能充分利用HTML那千變?nèi)f化的顯示技巧。XML數(shù)據(jù)島就是這種技術(shù)融合的產(chǎn)物,它使用<
XML>標(biāo)簽把XML數(shù)據(jù)直接嵌入到HTML頁面中,從而實現(xiàn)了二者的優(yōu)勢互補。
IE中數(shù)據(jù)島的處理方式
為了能夠處理這種內(nèi)嵌XML代碼的HTML頁面,Internet Explorer 4.0(以下簡稱IE 4.0)引入了DSO(Data Source Objects,數(shù)據(jù)源對象)技術(shù),用Java Applet實現(xiàn)。
例如:
< APPLET CODE=“com.ms.xml.dso.XMLDSO.class”
ID=“xmldso” WIDTH=0 HEIGHT=0 MAYSCRIPT=TRUE>
< PARAM NAME=“URL” value=“myXML.xml”>
< /APPLET>
上述例子中,CODE屬性指明了DSO Java小程序,MAYSCRIPT屬性保證用戶端腳本能夠處理數(shù)據(jù)對象,PARAM標(biāo)簽指明了XML文檔的位置。
使用Java的局限性在于只能在HTML文檔中說明XML的URL地址,而不能直接將XML標(biāo)簽嵌入其中,這就和真正的數(shù)據(jù)島方案還有一定的差距。微軟
在Internet Explorer 5.0(以下簡稱IE
5.0)中對DSO技術(shù)進行了擴展,突破了以往的限制,使HTML和XML真正地融合到了一起。HTML頁面中支持直接使用< XML>標(biāo)簽。
例如:
< HTML>
< XML ID=“xmldso”>
< ?xml version=“1.0”?>
some XML……
< /XML>
只要保證每個數(shù)據(jù)島的ID都是唯一的,就可以在頁面中的任何必要的地方嵌入數(shù)據(jù)島,并且這些DSO彼此都是相互獨立的。
除了上面例子中的這種直接嵌入方式,還可以使用外部引用方式鏈接數(shù)據(jù)島。
例如:
< XML ID=“xmldso” SRC=“myXML.xml”>
< /XML>
這樣,只有當(dāng)公司的客戶對象繼續(xù)使用IE 4.0,并且為了解決這部分客戶的兼容性問題時,Java Applet才是編程人員要考慮的選擇方案。
在IE 5.0所實現(xiàn)的DSO技術(shù)中,如果數(shù)據(jù)是通過SQL語言對數(shù)據(jù)庫進行查詢得到的結(jié)果,那么就把它們存放在ADO(ActiveX Data
Objects)記錄集中。服務(wù)器把這種ActiveX控件(通常是ADO記錄集)發(fā)送到客戶端,由客戶端腳本程序做進一步的處理。實際上,IE
5.0就是把XML數(shù)據(jù)島作為一種特殊的ADO記錄集進行處理的。
XML的數(shù)據(jù)綁定
1.ADO記錄集的映射
XML中的每一條主元素都被映射為ADO記錄集中的一條記錄,而子元素則相應(yīng)地被映射到記錄集中的字段(也稱為域)。
例如,存在XML數(shù)據(jù)島books.xml如下:
< XML ID=“xmldso”>
< ?xml version=“1.0”?>
< booklist>
< book>
< title>Straight Talk About Computers< /title>
< isbn>72-80088-005< /isbn>
< /book>
< book>
< title> Gourmet Microwave < /title>
< isbn>72-80081-082< /isbn>
< /book>
< /booklist>
< /XML>
此時,映射后的ADO記錄集為:
title isbn
Straight Talk About Computers 72-80088-005
Gourmet Microwave 72-80081-082
2.與HTML元素的綁定
在HTML文檔中嵌入數(shù)據(jù)島之后,就可以將XML數(shù)據(jù)島與HTML元素綁定在一起。每一個DSO條目(即數(shù)據(jù)島)都有唯一的ID號。首先將HTML元素
中的DATASRC屬性設(shè)置為相應(yīng)的ID,就可以把HTML元素和數(shù)據(jù)島聯(lián)系在一起。然后再通過設(shè)置DATAFLD屬性值,來確定所提取的XML元素。
例如,與DIV元素綁定的代碼如下:
< DIV ID=title DATASRC=#xmldso DATAFLD=“title”>< /DIV>
< DIV ID=price DATASRC=#xmldso DATAFLD=“isbn”>< /DIV>
注意:并非所有的HTML元素都能與XML數(shù)據(jù)島綁定。目前,支持這種DSO綁定機制的元素如下:
A、APPLET、BUTTON、DIV、FRAME、IFRAME、 IMG、INPUT (此處類型是:CHECKBOX、HIDDEN、
LABEL、PASSWORD、RADIO和TEXT)、LABEL、 MARQUEE、SELECT、SPAN、TABLE和 TEXTAREA。
3.以表格方式顯式XML數(shù)據(jù)
若把XML數(shù)據(jù)與TABLE元素綁定在一起,就可以自動地顯示為多行的表格形式。
例如,XML數(shù)據(jù)與TABLE元素綁定的代碼如下:
< TABLE BORDER=1 DATASRC=“#xmldso”>
< THEAD>
< TR>< TH>Title< /TH>
< TH>ISBN< /TH>< /TR>
< /THEAD>
< TBODY>
< TR>< TD>< DIV DATAFLD=“title”>< /DIV>< /TD>
< TD>< DIV DATAFLD=“isbn”>
< /DIV>< /TD>< /TR>
< /TBODY>
< /TABLE>
這樣,通過將TABLE元素中的DATASRC屬性設(shè)定為#xmldso,把兩者綁定起來。表格內(nèi)部分為表頭(THEAD)和表體(TBODY)兩部
分。每一個< book>元素都會顯示為一行表格,具體每一欄顯示哪一項數(shù)據(jù),則由DIV元素中的DATAFLD屬性指定。
一般情況下,我們從數(shù)據(jù)庫中查詢得到的結(jié)果集可能很大,所以從服務(wù)器返回到客戶端時,數(shù)據(jù)會被分成若干個頁面分別進行傳遞。此時,利用TABLE元素中的DATAPAGESIZE屬性可以指定每個頁面包含記錄集條目的個數(shù)。
例如:
< TABLE DATASRC=“#xmldso” DATAPAGESIZE=10>
很顯然,如果XML數(shù)據(jù)格式是對稱的,則無論是映射到ADO記錄集還是綁定到表格元素上,效果都會很好。而在實際應(yīng)用中,XML數(shù)據(jù)為非對稱的例子也
很多,比如一本書的作者可能就不止一位,這在映射和綁定時都會產(chǎn)生一定的麻煩。解決問題的辦法就是利用嵌套。每一行表格仍對應(yīng)一條主元素,每一欄也對應(yīng)著
一個子元素。對于重復(fù)元素,則使用嵌套的表格。我們假設(shè)在books.xml中,第一本書的作者為Dean
Straight,第二本書的作者為Charlotte Cooper、Shelley Burke和Regina Murphy。此時,綁定過程如下:
● 創(chuàng)建TABLE元素,并將數(shù)據(jù)島ID賦值給DATAFLD屬性;
● 對于單獨的XML元素,如< isbn>,創(chuàng)建TD元素,并設(shè)定相應(yīng)的DATAFLD屬性;
● 對于重復(fù)元素,在TD元素內(nèi)部嵌套一個表格;
● 用單行單列的形式顯示作者信息。
注意這里的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>
事實上,使用DSO效果最好的情況是針對結(jié)構(gòu)對稱的數(shù)據(jù),而處理非對稱數(shù)據(jù)更有效的辦法是使用我們以后將要介紹的DOM技術(shù)。
DSO技術(shù)的應(yīng)用
1. 訪問元素的屬性
用DSO訪問元素的屬性很簡單,可以直接把屬性按子元素來處理。
例如:
< book isbn=“9-001-122-12”>
……
< /book>
這樣,在綁定到HTML表格中時,就可以直接按子元素來處理:
< TD>< SPAN DATAFLD=“isbn”> < /SPAN>< /TD>
如果遇到屬性名和子元素名一樣的情況,在元素名前加上“!”進行區(qū)分。 2.遍歷記錄集
DSO把XML數(shù)據(jù)島當(dāng)做ADO記錄集進行處理的一大好處是可以利用ADO提供的各種方法對數(shù)據(jù)源進行訪問,尤其是當(dāng)把數(shù)據(jù)島與類似SPAN、DIV和
INPUT等HTML元素綁定時。通常這些元素顯示的是記錄集的首條記錄,要想對記錄集進行遍歷瀏覽,可以使用ADO的方法 :
Move、MoveFirst、MoveLast、MoveNext和MovePrevious。比如創(chuàng)建一個按鈕響應(yīng)函數(shù),只要用戶點擊“Next”按
鈕,就可以逐條瀏覽相應(yīng)的記錄。
例如:
< XML ID=“xmldso” SRC=“books.xml”>
< /XML>
Sub btnNext_onclick()
xmldso.RecordSet.MoveNext
End Sub
3.與Script語言相結(jié)合
有些用戶比較習(xí)慣編寫Script語言,利用DSO技術(shù)同樣可以與各種Script很好地結(jié)合在一起。
例如(以VB Script為例),訪問記錄集時,代碼如下:
Dim rsBooks
Set rsBooks = xmldso.RecordSet
訪問字段(子元素)的值:
Dim sTitle
sTitle = rsBooks(“title”)
可以使用innerText和innerHTML屬性把得到的值傳遞給HTML元素。例如,有一個DIV元素名為divTitle,賦值代碼如下所示:
divTitle.innerTEXT = sTitle
利用腳本程序還可以處理許多DSO事件,下表列舉了其中的一部分事件:
在腳本中處理各種事件的方法就是在< SCRIPT>標(biāo)簽中使用FOR屬性指定XML數(shù)據(jù)島ID,使用EVENT屬性確定事件類型。
例如,獲取記錄集中條目的個數(shù):
< SCRIPT Language=“VB Script” FOR=“xmldso” EVENT=“onDataAvailable”>
lblRecords.value = booklist.RecordSet.RecordCount
< /SCRIPT>
除了顯示記錄數(shù)據(jù)之外,腳本程序還可以對記錄集進行快速查詢、排序、編輯等操作。但要指出的是,雖然ADO技術(shù)中提供了類似SortColumn和
SortAscending等方法對XML數(shù)據(jù)進行排序,但是效果不如XSL中的排序操作,所以建議大家充分利用XSL技術(shù)來實現(xiàn)這部分功能。
其余的功能,如利用腳本對記錄集進行諸如增加、刪除、修改等操作,或是分頁顯示HTML表格等等,在這里就不一一舉例說明了,用法與前面的操作大同小
異。最后需要說明的是,所有對DSO對象的操作都是在用戶端完成的,實際上是服務(wù)器數(shù)據(jù)對象的一份復(fù)制品,這樣做的好處是避免了網(wǎng)絡(luò)承受大量數(shù)據(jù)通信的負
擔(dān)。但這時用戶端所做的任何操作對服務(wù)器上存儲的數(shù)據(jù)毫無影響,如果要想對服務(wù)器記錄也進行修改,那么就要用到客戶端與服務(wù)器端的數(shù)據(jù)交換技術(shù),我們將在
以后對此進行介紹。
原文地址:http://webdev.csdn.net/page/337792ab-1086-4b0e-bef3-d6d2ecc810a6
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining