Web設(shè)計中如何使用XML數(shù)據(jù)源對象
更新時間:2006年10月11日 00:00:00 作者:
XML數(shù)據(jù)源對象是一個ActiveX控件,允許你在XML文件和HTML頁面之間操作數(shù)據(jù)。本文將向你展示如何從各種XML數(shù)據(jù)源中提取數(shù)據(jù),以及如何使用JavaScript顯示這些數(shù)據(jù)。
XML數(shù)據(jù)源對象DSO是一個微軟ActiveX控件,構(gòu)建在微軟IE4以后的版本上。這個對象允許你把一個外部的XML文件或者嵌入HTML文件中的內(nèi)容提取到HTML頁面中。
你可以在一個Web頁面中使用XML - DSO從一個外部XML文件中選取內(nèi)容,從嵌入Web頁面的XML中提取XML數(shù)據(jù),然后使用JavaScript操作這些數(shù)據(jù)。然而,并不建議在Internet中使用這個對象,因為DSO只能工作在MSIE 4以上的瀏覽器中,因此這可能會帶來一些兼容性問題。 所以,在企業(yè)內(nèi)部網(wǎng)使用XML-DSO是很合適的。
開始
為了初始化XML - DSO對象,我們使用<OBJECT>標記。 用于XML-DSO的CLASSID是:
CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39
這ID唯一標識XML-DSO。使用下面的代碼在一個Web頁面中初始化這個控件:
?。糘BJECT ID="SomeID" CLASSID="CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39"></OBJECT>
雖然大部分對象需要許多參數(shù)與之相關(guān)聯(lián),但是XML-DSO不需要任何參數(shù)。
使用一個XML數(shù)據(jù)島析取數(shù)據(jù)
首先,通過使用<XML>標記包含一個XML數(shù)據(jù)島。其次,給它分配一個ID,xmldb --以備以后使用。 數(shù)據(jù)實際上是使用HTML標記:<ALT>,<SPAN>,<DIV>等等提取的。代碼列表1中的代碼使用了<SPAN>標記。datasrc屬性指定了你想從中提取數(shù)據(jù)的那個數(shù)據(jù)島。datafld屬性指定了你想要的數(shù)據(jù)的XML標記。所以,第一個<SPAN>提取名稱,而第二<SPAN>提取性別。
代碼列表1:
注意這段代碼沒有初始化一個XML-DSO對象。這是因為XML數(shù)據(jù)島的使用中已經(jīng)隱式地創(chuàng)建了一個。輸出應(yīng)為:
Premshree Pillai
male
注意在XML數(shù)據(jù)島中有兩個<name>和<sex>標記。使用這個方法,你只能提取這些標記中的第一個實例。代碼列表2中的代碼使用<TABLE>標記提取所有的實例:
輸出將是:
在代碼列表2中,<TABLE>標記使用<TD>標記內(nèi)的<DIV>標記提取數(shù)據(jù)。表格將自動重復(fù)<member>(<name>和<sex>的母標記)的每個實例。
代碼列表2:
使用外部XML文件提取數(shù)據(jù)
為了使用XML-DSO加載一個外部XML文件,你必須顯式的包含這個對象并且使用一些JavaScript。
首先創(chuàng)建一個XML-DSO對象,使用ID myXML。添加寬度和高度屬性到<OBJECT>標記中,然后設(shè)置它們的值為0。這保證XML-DSO對象不會占據(jù)你的Web頁面的任何空間。
其次,使用datasrc創(chuàng)建一個象myXML一樣的表--類似于代碼列表2中一樣。代碼使用<DIV>標記(在TD標記之)提取數(shù)據(jù),使用datafld作為第一欄的信息,并且使用URL作為第二欄。添加<SCRIPT>標記,因為在這里,外部的XML使用Java腳本顯式地聲明你想要加載的XML文件。
設(shè)置變量xmlDso為myXML.XMLDocument。myXML引用你已經(jīng)創(chuàng)建的對象。接下來,使用XML-DSO的load()方法加載example3.xml。文件example3.xml連接到對象myXML上。
現(xiàn)在,研究一下下面的HTML頁面:
輸出應(yīng)是:
Message URL
JavaScript Ticker using XML DSO http://someURL.com
上面的腳本非常特殊化。下面給出一個更一般的腳本:
使用XML-DSO和JavaScript
假設(shè)你有一個包含姓名、電子郵件地址和電話號碼的XML文件。你想使用它構(gòu)建一個應(yīng)用程序,顯示每個人的檔案--一次顯示一個。用戶將使用"Next"和"Previous"按鈕瀏覽每個人的數(shù)據(jù)。Javascript可以幫助你實現(xiàn)這個目的。
下面的代碼使用記錄集方法把文件中所有的數(shù)據(jù)保存到一個變量memberSet中。moveNext()方法指向下一個數(shù)據(jù)項(下一行)。腳本然后載入XML文件example4.xml,把記錄保存到變量memberSet中。第一個記錄將被顯示,但是memberSet.moveNext()指向文件中相對于前一個指定數(shù)據(jù)的下一個記錄。
這里是相應(yīng)的HTML文件:
輸出應(yīng)是:
Vinod
下面給出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一個數(shù)據(jù)項。
· moveFirst(): 指向第一個數(shù)據(jù)項。
· moveLast(): 指向最后一個數(shù)據(jù)項。
· EOF: 這個屬性用來檢測我們是否已經(jīng)到達數(shù)據(jù)記錄的底部。
使用XML-DSO和JavaScript
假設(shè)你有一個包含姓名、電子郵件地址和電話號碼的XML文件。你想使用它構(gòu)建一個應(yīng)用程序,顯示每個人的檔案--一次顯示一個。用戶將使用"Next"和"Previous"按鈕瀏覽每個人的數(shù)據(jù)。Javascript可以幫助你實現(xiàn)這個目的。
下面的代碼使用記錄集方法把文件中所有的數(shù)據(jù)保存到一個變量memberSet中。moveNext()方法指向下一個數(shù)據(jù)項(下一行)。腳本然后載入XML文件example4.xml,把記錄保存到變量memberSet中。第一個記錄將被顯示,但是memberSet.moveNext()指向文件中相對于前一個指定數(shù)據(jù)的下一個記錄。
這里是相應(yīng)的HTML文件:
輸出應(yīng)是:
Vinod
下面給出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一個數(shù)據(jù)項。
· moveFirst(): 指向第一個數(shù)據(jù)項。
· moveLast(): 指向最后一個數(shù)據(jù)項。
· EOF: 這個屬性用來檢測我們是否已經(jīng)到達數(shù)據(jù)記錄的底部。
initTicker()首先檢查是否有IE 4+。如果瀏覽器是IE4+,這個XML文件被作為一個參數(shù)被傳遞并載入。如果定時器失敗了,那么調(diào)用xmlDsoTicker()函數(shù)。xmlDsoTicker()除了xmlFile參數(shù)以外,和initTicker()有相同的參數(shù),因為XML文件已經(jīng)被載入。xmlDsoTicker()檢查變量counter(初始值為maxMsgs)是否小于maxMsgs-1。如果是,moveNext()方法指向tickerSet中下一個數(shù)據(jù)項。
HTML頁面的BODY包含下面的代碼:

圖1:定時器應(yīng)用程序顯示輸出。
在這段代碼中,<A>標記把XML文件的URL作為它的datafld。<SPAN>標記把XML文件的信息作為它的datafld。這個信息在<SPAN>元素中顯示,然后整個信息可以通過這段信息相應(yīng)的URL連接。
這樣,<A>和<SPAN>元素包含下一個數(shù)據(jù)項(URL和信息)。在一段延遲以后,<A>和<SPAN>指向下一個數(shù)據(jù)。只要counter<maxMsgs-1(計數(shù)器每次遞增),這個操作就會發(fā)生。如果counter<maxMsgs-1是假,計數(shù)器就被設(shè)置為0,然后指向tickerSet中的第一個數(shù)據(jù)項。
XML數(shù)據(jù)源對象DSO是一個微軟ActiveX控件,構(gòu)建在微軟IE4以后的版本上。這個對象允許你把一個外部的XML文件或者嵌入HTML文件中的內(nèi)容提取到HTML頁面中。
你可以在一個Web頁面中使用XML - DSO從一個外部XML文件中選取內(nèi)容,從嵌入Web頁面的XML中提取XML數(shù)據(jù),然后使用JavaScript操作這些數(shù)據(jù)。然而,并不建議在Internet中使用這個對象,因為DSO只能工作在MSIE 4以上的瀏覽器中,因此這可能會帶來一些兼容性問題。 所以,在企業(yè)內(nèi)部網(wǎng)使用XML-DSO是很合適的。
開始
為了初始化XML - DSO對象,我們使用<OBJECT>標記。 用于XML-DSO的CLASSID是:
CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39
這ID唯一標識XML-DSO。使用下面的代碼在一個Web頁面中初始化這個控件:
?。糘BJECT ID="SomeID" CLASSID="CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39"></OBJECT>
雖然大部分對象需要許多參數(shù)與之相關(guān)聯(lián),但是XML-DSO不需要任何參數(shù)。
使用一個XML數(shù)據(jù)島析取數(shù)據(jù)
首先,通過使用<XML>標記包含一個XML數(shù)據(jù)島。其次,給它分配一個ID,xmldb --以備以后使用。 數(shù)據(jù)實際上是使用HTML標記:<ALT>,<SPAN>,<DIV>等等提取的。代碼列表1中的代碼使用了<SPAN>標記。datasrc屬性指定了你想從中提取數(shù)據(jù)的那個數(shù)據(jù)島。datafld屬性指定了你想要的數(shù)據(jù)的XML標記。所以,第一個<SPAN>提取名稱,而第二<SPAN>提取性別。
代碼列表1:
<!-- example1.htm --> <html> <head> <title>XML DSO-example1.htm</title> </head> <body bgcolor="#FFFFFF"> <xml id="xmldb"> <db> <member> <name>Premshree Pillai<name> <sex>male</sex> </member> <member> <name>Vinod</name> <sex>male</sex> </member> </db> </xml> <span datasrc="#xmldb" datafld="name"<</span> <br> <span datasrc="#xmldb" datafld="sex"></span> </body> </html> |
注意這段代碼沒有初始化一個XML-DSO對象。這是因為XML數(shù)據(jù)島的使用中已經(jīng)隱式地創(chuàng)建了一個。輸出應(yīng)為:
Premshree Pillai
male
注意在XML數(shù)據(jù)島中有兩個<name>和<sex>標記。使用這個方法,你只能提取這些標記中的第一個實例。代碼列表2中的代碼使用<TABLE>標記提取所有的實例:
輸出將是:
Name | Sex |
Premshree Pillai | male |
Vinod | male |
在代碼列表2中,<TABLE>標記使用<TD>標記內(nèi)的<DIV>標記提取數(shù)據(jù)。表格將自動重復(fù)<member>(<name>和<sex>的母標記)的每個實例。
代碼列表2:
<!-- example2.htm --> <html> <head> <title>XML DSO-example2.htm</title> </head> <body bgcolor="#FFFFFF"> <xml id="xmldb"> <db> <member> <name>Premshree Pillai<name> <sex>male</sex> </member> <member> <name>Vinod</name> <sex>male</sex> </member> </db> </xml> <table datasrc="#xmldb" border="1"> <thead> <th>Name</th> <th>Sex</th> </thead> <tr> <td><div datafld="name"></div></td> <td><div datafld="sex"></div></td> </tr> </table> </body> </html> |
使用外部XML文件提取數(shù)據(jù)
為了使用XML-DSO加載一個外部XML文件,你必須顯式的包含這個對象并且使用一些JavaScript。
首先創(chuàng)建一個XML-DSO對象,使用ID myXML。添加寬度和高度屬性到<OBJECT>標記中,然后設(shè)置它們的值為0。這保證XML-DSO對象不會占據(jù)你的Web頁面的任何空間。
其次,使用datasrc創(chuàng)建一個象myXML一樣的表--類似于代碼列表2中一樣。代碼使用<DIV>標記(在TD標記之)提取數(shù)據(jù),使用datafld作為第一欄的信息,并且使用URL作為第二欄。添加<SCRIPT>標記,因為在這里,外部的XML使用Java腳本顯式地聲明你想要加載的XML文件。
設(shè)置變量xmlDso為myXML.XMLDocument。myXML引用你已經(jīng)創(chuàng)建的對象。接下來,使用XML-DSO的load()方法加載example3.xml。文件example3.xml連接到對象myXML上。
<!-- example3.xml --> <?xml version="1.0" ?> <ticker> <item> <message>JavaScript Ticker using XML DSO</message> <URL>http://someURL.com</URL> </item> </ticker> |
現(xiàn)在,研究一下下面的HTML頁面:
<!-- example3.htm --> <html> <head> <title>XML DSO-example3.htm</title> <script language="JavaScript"> function load() { var xmlDso=myXML.XMLDocument; xmlDso.load("example3.xml"); } </script> </head> <body bgcolor="#FFFFFF" onLoad="load()"> <object id="myXML" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" width="0" height="0"></object> <table datasrc="#myXML" border="1"> <thead> <th>Message</th> <th>URL</th> </thead> <tr> <td><div datafld="message"></div></td> <td><div datafld="URL"></div></td> </tr> </table> </body> </html> |
輸出應(yīng)是:
Message URL
JavaScript Ticker using XML DSO http://someURL.com
上面的腳本非常特殊化。下面給出一個更一般的腳本:
<script language="JavaScript"> var xmlDso; function load(xmlFile, objName) { eval('xmlDso='+objName+'.XMLDocument'); xmlDso.load(xmlFile); } </script> Now, to load any XML file use: load("SomeXMLFile.xml","anyXmlDsoObject"); |
使用XML-DSO和JavaScript
假設(shè)你有一個包含姓名、電子郵件地址和電話號碼的XML文件。你想使用它構(gòu)建一個應(yīng)用程序,顯示每個人的檔案--一次顯示一個。用戶將使用"Next"和"Previous"按鈕瀏覽每個人的數(shù)據(jù)。Javascript可以幫助你實現(xiàn)這個目的。
下面的代碼使用記錄集方法把文件中所有的數(shù)據(jù)保存到一個變量memberSet中。moveNext()方法指向下一個數(shù)據(jù)項(下一行)。腳本然后載入XML文件example4.xml,把記錄保存到變量memberSet中。第一個記錄將被顯示,但是memberSet.moveNext()指向文件中相對于前一個指定數(shù)據(jù)的下一個記錄。
<!-- example4.xml --> <?xml version="1.0" ?> <myDB> <member> <name>Premshree Pillai</name> <sex>male</sex> </member> <member> <name>Vinod</name> <sex>male</sex> </member> <member> <name>Santhosh</name> <sex>male</sex> </member> </myDB> |
這里是相應(yīng)的HTML文件:
<!-- example4.htm --> <html> <head> <title>XML DSO-example4.htm</title> <script language="JavaScript"> function load() { var xmlDso=myDB.XMLDocument; xmlDso.load("example4.xml"); /* Get the complete record set */ var memberSet=myDB.recordset; /* Go to next data */ memberSet.moveNext(); } </script> </head> <body bgcolor="#FFFFFF" onLoad="load()"> <object id="myDB" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" width="0" height="0"></object> <span datasrc="#myDB" datafld="name"></span> </body> </html> |
輸出應(yīng)是:
Vinod
下面給出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一個數(shù)據(jù)項。
· moveFirst(): 指向第一個數(shù)據(jù)項。
· moveLast(): 指向最后一個數(shù)據(jù)項。
· EOF: 這個屬性用來檢測我們是否已經(jīng)到達數(shù)據(jù)記錄的底部。
使用XML-DSO和JavaScript
假設(shè)你有一個包含姓名、電子郵件地址和電話號碼的XML文件。你想使用它構(gòu)建一個應(yīng)用程序,顯示每個人的檔案--一次顯示一個。用戶將使用"Next"和"Previous"按鈕瀏覽每個人的數(shù)據(jù)。Javascript可以幫助你實現(xiàn)這個目的。
下面的代碼使用記錄集方法把文件中所有的數(shù)據(jù)保存到一個變量memberSet中。moveNext()方法指向下一個數(shù)據(jù)項(下一行)。腳本然后載入XML文件example4.xml,把記錄保存到變量memberSet中。第一個記錄將被顯示,但是memberSet.moveNext()指向文件中相對于前一個指定數(shù)據(jù)的下一個記錄。
<!-- example4.xml --> <?xml version="1.0" ?> <myDB> <member> <name>Premshree Pillai</name> <sex>male</sex> </member> <member> <name>Vinod</name> <sex>male</sex> </member> <member> <name>Santhosh</name> <sex>male</sex> </member> </myDB> |
這里是相應(yīng)的HTML文件:
<!-- example4.htm --> <html> <head> <title>XML DSO-example4.htm</title> <script language="JavaScript"> function load() { var xmlDso=myDB.XMLDocument; xmlDso.load("example4.xml"); /* Get the complete record set */ var memberSet=myDB.recordset; /* Go to next data */ memberSet.moveNext(); } </script> </head> <body bgcolor="#FFFFFF" onLoad="load()"> <object id="myDB" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" width="0" height="0"></object> <span datasrc="#myDB" datafld="name"></span> </body> </html> |
輸出應(yīng)是:
Vinod
下面給出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一個數(shù)據(jù)項。
· moveFirst(): 指向第一個數(shù)據(jù)項。
· moveLast(): 指向最后一個數(shù)據(jù)項。
· EOF: 這個屬性用來檢測我們是否已經(jīng)到達數(shù)據(jù)記錄的底部。
initTicker()首先檢查是否有IE 4+。如果瀏覽器是IE4+,這個XML文件被作為一個參數(shù)被傳遞并載入。如果定時器失敗了,那么調(diào)用xmlDsoTicker()函數(shù)。xmlDsoTicker()除了xmlFile參數(shù)以外,和initTicker()有相同的參數(shù),因為XML文件已經(jīng)被載入。xmlDsoTicker()檢查變量counter(初始值為maxMsgs)是否小于maxMsgs-1。如果是,moveNext()方法指向tickerSet中下一個數(shù)據(jù)項。
HTML頁面的BODY包含下面的代碼:
<a href=" datasrc="#ticker" datafld="URL" class="tickerStyle"> <span datasrc="#ticker" datafld="message"></span> </a> |

圖1:定時器應(yīng)用程序顯示輸出。
在這段代碼中,<A>標記把XML文件的URL作為它的datafld。<SPAN>標記把XML文件的信息作為它的datafld。這個信息在<SPAN>元素中顯示,然后整個信息可以通過這段信息相應(yīng)的URL連接。
這樣,<A>和<SPAN>元素包含下一個數(shù)據(jù)項(URL和信息)。在一段延遲以后,<A>和<SPAN>指向下一個數(shù)據(jù)。只要counter<maxMsgs-1(計數(shù)器每次遞增),這個操作就會發(fā)生。如果counter<maxMsgs-1是假,計數(shù)器就被設(shè)置為0,然后指向tickerSet中的第一個數(shù)據(jù)項。
您可能感興趣的文章: