第五章:XML實(shí)例解析
提綱:
一:實(shí)例效果
二:實(shí)例解析
1.定義新標(biāo)識(shí)。
2.建立XML文檔。
3.建立相應(yīng)的HTML文件。
XML在不同領(lǐng)域有著廣泛的應(yīng)用,比如在科技領(lǐng)域的MathML,無(wú)線通信應(yīng)用的WML,在網(wǎng)絡(luò)圖象方面的SVG等等,我們這里側(cè)重討論XML在web上的應(yīng)用。XML在web上應(yīng)用主要是利用其強(qiáng)大的數(shù)據(jù)操作能力。一般用XML配合javascript和asp等服務(wù)器端程序,可以實(shí)現(xiàn)網(wǎng)絡(luò)上幾乎所有的應(yīng)用需求。
考慮講解方便,我們?cè)谙旅娼榻B一個(gè)簡(jiǎn)單的實(shí)例,不包含服務(wù)器端程序。目的在于讓您對(duì)XML的數(shù)據(jù)操作能力有一個(gè)感性的認(rèn)識(shí)。
好,我們首先[ 點(diǎn)擊這里 ]來(lái)看實(shí)例的效果。(請(qǐng)用IE5.0以上版本瀏覽器打開(kāi))
這是一個(gè)簡(jiǎn)單的CD唱片數(shù)據(jù)檢索功能。你通過(guò)點(diǎn)擊"上一張","下一張"可以看到單張CD的有關(guān)信息。這樣的效果我們?cè)瓉?lái)用兩種方法可以實(shí)現(xiàn):
1.利用DHTML,將數(shù)據(jù)隱藏在不同的層中,通過(guò)鼠標(biāo)事件依次顯示;
2.利用后臺(tái)程序(如ASP,CGI,PHP,JSP等),調(diào)用服務(wù)器端的數(shù)據(jù)。
但是在這個(gè)實(shí)例中,我們打開(kāi)頁(yè)面原代碼可以看到,其中沒(méi)有用DHTML的DIV,也沒(méi)有表單的action,它完全是用XML來(lái)實(shí)現(xiàn)的。下面我們來(lái)分析它的制作過(guò)程:
第一步:定義新標(biāo)識(shí)。
根據(jù)實(shí)際的CD數(shù)據(jù),首先新建一個(gè)名為CD>的標(biāo)識(shí);其次建立它相關(guān)的數(shù)據(jù)標(biāo)識(shí),分別是:CD名稱(chēng)Title>,演唱者Artist>,出版年代Year>,國(guó)家Country>,發(fā)行公司Company>和價(jià)格Price>;最后還要建立一個(gè)名為目錄CATALOG>的標(biāo)識(shí)。為什么要再建立一個(gè)CATALOG>標(biāo)識(shí)呢?因?yàn)樵赬ML文檔中規(guī)定,必須且只能有一個(gè)根元素(標(biāo)識(shí)),我們有多個(gè)CD數(shù)據(jù),這些數(shù)據(jù)是并列的關(guān)系,所以需要為這些并列的元素建立一個(gè)根元素。
以上元素的定義和關(guān)系都完全符合XML標(biāo)準(zhǔn),不需要特別的DTD文件來(lái)定義,所以可以省略DTD定義。如果我們想使用DTD來(lái)定義,以上過(guò)程可以表示為:
!ELEMENT CATALOG (CD)*>
!ELEMENT CD (Title,Artist,Year,Country,Company,Price)>
!ELEMENT Title (#PCDATA)>
!ELEMENT Artist (#PCDATA)>
!ELEMENT Year (#PCDATA)>
!ELEMENT Country (#PCDATA)>
!ELEMENT Company (#PCDATA)>
!ELEMENT Price (#PCDATA)>
這段代碼表示:元素CATALOG包含多個(gè)CD子元素,而子元素CD又依次包含Title, Artist, Year, Country, Company, Price 六個(gè)子元素,它們的內(nèi)容都定義為文本(字符,數(shù)字,文本)。(注:具體的語(yǔ)法說(shuō)明可以看上一章關(guān)于DTD的介紹)
第二步:建立XML文檔。
?xml version="1.0"?>
CATALOG>
CD>
TITLE>Empire Burlesque/TITLE>
ARTIST>Bob Dylan/ARTIST>
COUNTRY>USA/COUNTRY>
COMPANY>Columbia/COMPANY>
PRICE>10.90/PRICE>
YEAR>1985/YEAR>
/CD>
CD>
TITLE>Hide your heart/TITLE>
ARTIST>Bonnie Tylor/ARTIST>
COUNTRY>UK/COUNTRY>
COMPANY>CBS Records/COMPANY>
PRICE>9.90/PRICE>
YEAR>1988/YEAR>
/CD>
CD>
TITLE>Greatest Hits/TITLE>
ARTIST>Dolly Parton/ARTIST>
COUNTRY>USA/COUNTRY>
COMPANY>RCA/COMPANY>
PRICE>9.90/PRICE>
YEAR>1982/YEAR>
/CD>
CD>
TITLE>Still got the blues/TITLE>
ARTIST>Gary More/ARTIST>
COUNTRY>UK/COUNTRY>
COMPANY>Virgin redords/COMPANY>
PRICE>10.20/PRICE>
YEAR>1990/YEAR>
/CD>
CD>
TITLE>Eros/TITLE>
ARTIST>Eros Ramazzotti/ARTIST>
COUNTRY>EU/COUNTRY>
COMPANY>BMG/COMPANY>
PRICE>9.90/PRICE>
YEAR>1997/YEAR>
/CD>
/CATALOG>
上面代碼首先用?xml version="1.0"?>聲明語(yǔ)句表明這是一個(gè)XML文檔,它的格式遵守XML 1.0標(biāo)準(zhǔn)規(guī)范。然后是文檔內(nèi)容,結(jié)構(gòu)樹(shù)非常清晰:
CATALOG>
CD>
......
/CD>
CD>
......
/CD>
/CATALOG>
一共定義了5組數(shù)據(jù)。我們將上面的代碼存為cd.xml文件,以備調(diào)用。
第三步:建立相應(yīng)的HTML文件。
1.導(dǎo)入XML數(shù)據(jù)。
我們知道,目前流行的瀏覽器中,暫時(shí)只有微軟的IE5.0以上版本瀏覽器支持XML。IE是通過(guò)在HTML中的object物件來(lái)支持插入XML,并通過(guò)js的XMLDocument.load()方法來(lái)導(dǎo)入數(shù)據(jù)。我們看代碼: object WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso">
/object>
定義一個(gè)object,ID名為xmldso。然后在head區(qū)用js引入xml數(shù)據(jù):
script for="window" event="onload">
xmldso.XMLDocument.load("cd.xml");
/script>
2.捆綁數(shù)據(jù)。
然后將用SPAN>標(biāo)識(shí)來(lái)將XML數(shù)據(jù)綁定在表格中。其中ID,DATASRC,DTATFLD都是SPAN>的屬性。代碼如下:
table>
tr>td>Title:/td>td>SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE">/SPAN>/td>/tr>
tr>td>Artist:/td>td>SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST">/SPAN>/td>/tr>
tr>td>Year:/td>td>SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR">/SPAN>/td>/tr>
tr>td>Country:/td>td>SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY">/SPAN>/td>/tr>
tr>td>Company:/td>td>SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY">/SPAN>/td>/tr>
tr>td>Price:/td>td>SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE">/SPAN>/td>/tr>
/table>
3.動(dòng)作操作。
最后,為數(shù)據(jù)提供瀏覽按鈕:
INPUT TYPE=button VALUE="上一張CD" ONCLICK="moveprevious()">
INPUT TYPE=button VALUE="下一張CD" ONCLICK="movenext()">
并利用js來(lái)完成兩個(gè)鼠標(biāo)點(diǎn)擊功能:movenext()和moveprevious()。在head區(qū)加入如下代碼:
script language="JavaScript">
function movenext()
{
if (xmldso.recordset.absoluteposition xmldso.recordset.recordcount)
{
xmldso.recordset.movenext();
}
}
function moveprevious()
{
if (xmldso.recordset.absoluteposition > 1)
{
xmldso.recordset.moveprevious();
}
}
/script>
好,我們先看HTML文件的全部原代碼:
html>
head>
script for="window" event="onload">
xmldso.XMLDocument.load("cd.xml");
/script>
script language="JavaScript">
function movenext()
{
if (xmldso.recordset.absoluteposition xmldso.recordset.recordcount)
{
xmldso.recordset.movenext();
}
}
function moveprevious()
{
if (xmldso.recordset.absoluteposition > 1)
{
xmldso.recordset.moveprevious();
}
}
/script>
TITLE>CD Navigate/TITLE>
/head>
body>
p>
object WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso">
/object>
table>
tr>td>Title:/td>td>SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE">/SPAN>/td>/tr>
tr>td>Artist:/td>td>SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST">/SPAN>/td>/tr>
tr>td>Year:/td>td>SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR">/SPAN>/td>/tr>
tr>td>Country:/td>td>SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY">/SPAN>/td>/tr>
tr>td>Company:/td>td>SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY">/SPAN>/td>/tr>
tr>td>Price:/td>td>SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE">/SPAN>/td>/tr>
/table>
p>
INPUT TYPE=button VALUE="上一張CD" ONCLICK="moveprevious()">
INPUT TYPE=button VALUE="下一張CD" ONCLICK="movenext()">
/p>
/body>
/html>
將以上代碼存為cd.htm文件,于第二步的cd.xml文件放在一起。打開(kāi)cd.htm文件,你就看見(jiàn)和上面實(shí)例一樣的效果了。
好,到今天為止,我們已經(jīng)學(xué)習(xí)了關(guān)于XML的不少知識(shí),我們來(lái)總結(jié)一下前面五個(gè)章節(jié),分別是XML快速入門(mén),XML的概念原理,XML的術(shù)語(yǔ),XML的語(yǔ)法和本章的實(shí)例解析。到這里,教程部分就結(jié)束了。在寫(xiě)作過(guò)程中,阿捷盡最大努力將有關(guān)XML概念講得通俗易懂,盡量把自己的理解告訴給大家,但因?yàn)楸救藢W(xué)習(xí)XML時(shí)間也不長(zhǎng),對(duì)整個(gè)XML的技術(shù)把握還不夠系統(tǒng)和深入,所以難免有疏漏的地方,請(qǐng)大家指正和諒解,謝謝!