??xml version="1.0" encoding="utf-8" standalone="yes"?>
XML数据源对象DSO是一个微软ActiveX控gQ构建在微YIE4以后的版本上。这个对象允怽把一个外部的XML文g或者嵌入HTML文g中的内容提取到HTML面中。?/p>
你可以在一个Web面中用XML - DSO从一个外部XML文g中选取内容Q从嵌入Web面的XML中提取XML数据Q然后用JavaScript操作q些数据。然而,q不在Internet中用这个对象,因ؓDSO只能工作在MSIE 4以上的浏览器中,因此q可能会带来一些兼Ҏ问题。 所以,在企业内部网使用XML-DSO是很合适的。?/p>
开?/font>
Z初始化XML - DSO对象Q我们用<OBJECTQ标记。 用于XML-DSO的CLASSID是:
CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39
qID唯一标识XML-DSO。用下面的代码在一个Web面中初始化q个控gQ?/p>
QOBJECT ID="SomeID" CLASSID="CLSID:550dda30-0541-11d2-9ca9-0060b0ec3d39"Q</OBJECTQ?/p>
虽然大部分对象需要许多参C之相兌Q但是XML-DSO不需要Q何参数。?/p>
使用一个XML数据岛析取数?/font>
首先Q通过使用QXMLQ标记包含一个XML数据岛。其ơ,l它分配一个IDQxmldb --以备以后使用。 数据实际上是用HTML标记Q<ALTQ,QSPANQ,QDIVQ等{提取的。代码列?中的代码使用了<SPANQ标记。datasrc属性指定了你想从中提取数据的那个数据岛。datafld属性指定了你想要的数据的XML标记。所以,W一个<SPANQ提取名Uͼ而第二<SPANQ提取性别。?/p>
代码列表1Q?/p>
Q?-- example1.htm --Q?br />QhtmlQ?br />QheadQ?br />QtitleQXML DSO-example1.htmQ?titleQ?br />Q?headQ?br />Qbody bgcolor="#FFFFFF"Q?br />Qxml id="xmldb"Q?br />QdbQ?br />QmemberQ?br />QnameQPremshree PillaiQnameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQVinodQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />Q?dbQ?br />Q?xmlQ?/p>
Qspan datasrc="#xmldb" datafld="name"Q</spanQ?br />QbrQ?br />Qspan datasrc="#xmldb" datafld="sex"Q</spanQ?/p>
Q?bodyQ?br />Q?htmlQ ?/p>
注意q段代码没有初始化一个XML-DSO对象。这是因为XML数据岛的使用中已l隐式地创徏了一个。输出应为:
Premshree Pillai
male
注意在XML数据岛中有两个<nameQ和QsexQ标记。用这个方法,你只能提取这些标C的第一个实例。代码列?中的代码使用QTABLEQ标记提取所有的实例Q?/p>
输出是:
Name Sex
-----------------------------------
Premshree Pillai male
Vinod male
在代码列?中,QTABLEQ标C用<TDQ标记内的<DIVQ标记提取数据。表格将自动重复QmemberQ(QnameQ和QsexQ的母标讎ͼ的每个实例。?/p>
代码列表2Q?/p>
Q?-- example2.htm --Q?br />QhtmlQ?br />QheadQ?br />QtitleQXML DSO-example2.htmQ?titleQ?br />Q?headQ?br />Qbody bgcolor="#FFFFFF"Q?/p>
Qxml id="xmldb"Q?br />QdbQ?br />QmemberQ?br />QnameQPremshree PillaiQnameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQVinodQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />Q?dbQ?br />Q?xmlQ?/p>
Qtable datasrc="#xmldb" border="1"Q?br />QtheadQ?br />QthQNameQ?thQ?br />QthQSexQ?thQ?br />Q?theadQ?br />QtrQ?br />QtdQ<div datafld="name"Q</divQ</tdQ?br />QtdQ<div datafld="sex"Q</divQ</tdQ?br />Q?trQ?br />Q?tableQ?br />Q?bodyQ?br />Q?htmlQ?/p>
使用外部XML文g提取数据
Z使用XML-DSO加蝲一个外部XML文gQ你必须昑ּ的包含这个对象ƈ且用一些JavaScript。?/p>
首先创徏一个XML-DSO对象Q用ID myXML。添加宽度和高度属性到QOBJECTQ标CQ然后设|它们的gؓ0。这保证XML-DSO对象不会占据你的Web面的Q何空间。?/p>
其次Q用datasrc创徏一个象myXML一L?-cM于代码列?中一栗代码用<DIVQ标讎ͼ在TD标记之)提取数据Q用datafld作ؓW一栏的信息Qƈ且用URL作ؓW二栏。添加<SCRIPTQ标讎ͼ因ؓ在这里,外部的XML使用Java脚本昑ּ地声明你惌加蝲的XML文g。?/p>
讄变量xmlDso为myXML.XMLDocument。myXML引用你已l创建的对象。接下来Q用XML-DSO的load()Ҏ加蝲example3.xml。文件example3.xmlq接到对象myXML上。?/p>
Q?-- example3.xml --Q?br />Q?xml version="1.0" ?Q?br />QtickerQ?br />QitemQ?br />QmessageQJavaScript Ticker using XML DSOQ?messageQ?br />QURLQ?a class="contentlink" target="_blank">http://someURL.comQ?URLQ?br />Q?itemQ?br />Q?tickerQ?/p>
现在Q研I一下下面的HTML面:
Q?-- example3.htm --Q?br />QhtmlQ?br />QheadQ?br />QtitleQXML DSO-example3.htmQ?titleQ?br />Qscript language="JavaScript"Q?br />function load() {
var xmlDso=myXML.XMLDocument;
xmlDso.load("example3.xml");
}
Q?scriptQ?br />Q?headQ?br />Qbody bgcolor="#FFFFFF" onLoad="load()"Q?/p>
Qobject id="myXML" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
width="0" height="0"Q</objectQ?/p>
Qtable datasrc="#myXML" border="1"Q?br />QtheadQ?br />QthQMessageQ?thQ?br />QthQURLQ?thQ?br />Q?theadQ?br />QtrQ?br />QtdQ<div datafld="message"Q</divQ</tdQ?br />QtdQ<div datafld="URL"Q</divQ</tdQ?br />Q?trQ?br />Q?tableQ?/p>
Q?bodyQ?br />Q?htmlQ?/p>
输出应是:
Message URL
JavaScript Ticker using XML DSO http://someURL.com
上面的脚本非常特D化。下面给Z个更一般的脚本Q?/p>
Qscript language="JavaScript"Q?br />var xmlDso;
function load(xmlFile, objName) {
eval('xmlDso='+objName+'.XMLDocument');
xmlDso.load(xmlFile);
}
Q?scriptQ?br />Now, to load any XML file use:
load("SomeXMLFile.xml","anyXmlDsoObject");
使用XML-DSO和JavaScript
假设你有一个包含姓名、电子邮件地址和电话号码的XML文g。你想用它构徏一个应用程序,昄每个人的档案--一ơ显CZ个。用户将使用"Next"?Previous"按钮览每个人的数据。Javascript可以帮助你实现这个目的。?/p>
下面的代码用记录集Ҏ把文件中所有的数据保存C个变量memberSet中。moveNext()Ҏ指向下一个数据项Q下一行)。脚本然后蝲入XML文gexample4.xmlQ把记录保存到变量memberSet中。第一个记录将被显C,但是memberSet.moveNext()指向文g中相对于前一个指定数据的下一个记录。?/p>
Q?-- example4.xml --Q?br />Q?xml version="1.0" ?Q?br />QmyDBQ?br />QmemberQ?br />QnameQPremshree PillaiQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQVinodQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQSanthoshQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />Q?myDBQ?/p>
q里是相应的HTML文gQ?/p>
Q?-- example4.htm --Q?br />QhtmlQ?br />QheadQ?br />QtitleQXML DSO-example4.htmQ?titleQ?br />Qscript language="JavaScript"Q?br />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();
}
Q?scriptQ?br />Q?headQ?br />Qbody bgcolor="#FFFFFF" onLoad="load()"Q?/p>
Qobject id="myDB" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
width="0" height="0"Q</objectQ?/p>
Qspan datasrc="#myDB" datafld="name"Q</spanQ?/p>
Q?bodyQ?br />Q?htmlQ?/p>
输出应是:
Vinod
下面l出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一个数据项。?/p>
· moveFirst(): 指向W一个数据项。?/p>
· moveLast(): 指向最后一个数据项。?/p>
· EOF: q个属性用来检我们是否已l到达数据记录的底部?br />使用XML-DSO和JavaScript
假设你有一个包含姓名、电子邮件地址和电话号码的XML文g。你想用它构徏一个应用程序,昄每个人的档案--一ơ显CZ个。用户将使用"Next"?Previous"按钮览每个人的数据。Javascript可以帮助你实现这个目的。?/p>
下面的代码用记录集Ҏ把文件中所有的数据保存C个变量memberSet中。moveNext()Ҏ指向下一个数据项Q下一行)。脚本然后蝲入XML文gexample4.xmlQ把记录保存到变量memberSet中。第一个记录将被显C,但是memberSet.moveNext()指向文g中相对于前一个指定数据的下一个记录。?/p>
Q?-- example4.xml --Q?br />Q?xml version="1.0" ?Q?br />QmyDBQ?br />QmemberQ?br />QnameQPremshree PillaiQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQVinodQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />QmemberQ?br />QnameQSanthoshQ?nameQ?br />QsexQmaleQ?sexQ?br />Q?memberQ?br />Q?myDBQ ?/p>
q里是相应的HTML文gQ?/p>
Q?-- example4.htm --Q?br />QhtmlQ?br />QheadQ?br />QtitleQXML DSO-example4.htmQ?titleQ?br />Qscript language="JavaScript"Q?br />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();
}
Q?scriptQ?br />Q?headQ?br />Qbody bgcolor="#FFFFFF" onLoad="load()"Q?/p>
Qobject id="myDB" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
width="0" height="0"Q</objectQ?/p>
Qspan datasrc="#myDB" datafld="name"Q</spanQ?/p>
Q?bodyQ?br />Q?htmlQ?/p>
输出应是:
Vinod
下面l出更多使用JavaScript操作XML-DSO的方法:
· movePrevious(): 指向前一个数据项。?/p>
· moveFirst(): 指向W一个数据项。?/p>
· moveLast(): 指向最后一个数据项。?/p>
· EOF: q个属性用来检我们是否已l到达数据记录的底部。?/p>
initTicker()首先查是否有IE 4+。如果浏览器是IE4+Q这个XML文g被作Z个参数被传递ƈ载入。如果定时器p|了,那么调用xmlDsoTicker()函数。xmlDsoTicker()除了xmlFile参数以外Q和initTicker()有相同的参数Q因为XML文g已经被蝲入。xmlDsoTicker()查变量counterQ初始gؓmaxMsgsQ是否小于maxMsgs-1。如果是QmoveNext()Ҏ指向tickerSet中下一个数据项。?/p>
HTML面的BODY包含下面的代码:
Qa href="" datasrc="#ticker" datafld="URL" class="tickerStyle"Q?br />Qspan datasrc="#ticker" datafld="message"Q</spanQ?br />Q?aQ?/p>