关闭

XML第三篇:XML的泉源-ASP [转载]

558人阅读 评论(0) 收藏 举报
XML第三篇:XML的泉源-ASP

恆逸資訊教育訓練中心首頁

作者: 恆逸資訊 許嘉仁

XML的泉源-ASP
在上一期的文章中我們介紹了XSL技術的造型應用,同樣一份XML文件檔案,透過不同的XSL技術的轉換,可以有多樣的展現以及效果,但是這僅止於一份XML文件的使用。如果資料來源是資料庫,並非一份XML檔案,又該如何從資料庫取出並轉換成為XML資料?又如何將之展現在網頁上呢?這其中需要注意什麼呢?又有哪些特殊技巧呢?
在現今的網頁開發環境中,微軟的解決方案是ASP(Active Server Page),這一期就是要以ASP結合ADO將資料庫的資料以及XML的技術做一整合,唯有結合資料庫才能讓網頁內容豐富,讓網頁內容富有彈性以及即時性。

ASP 與 ADO

為了從資料庫取出資料並且展現,在網頁程式中將會使用ADO,這邊預設讀者已經相當熟悉,範例如下:
< HTML >
< HEAD >
< META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0" >
< /HEAD >
< BODY >

< %
set conn=server.CreateObject("adodb.connection") conn.Open "Provider=SQLOLEDB;Initial Catalog=Pubs;Data Source=(local);User Id=sa;Password=;"

set rs=conn.Execute("select * from titles")
% >
< TABLE WIDTH=100% BORDER=1 CELLSPACING=1 CELLPADDING=1 >
< TR align=center >
< TD >書號< /TD >
< TD >書名< /TD >
< TD >分類< /TD >
< TD >單價< /TD >
< /TR >
< %do until rs.eof% >
< TR >
< TD >< %=rs("title_id")% >< /TD >
< TD >< %=rs("title")% >< /TD >
< TD >< %=rs("type")% >< /TD >
< TD >< %=rs("price")% >< /TD >
< /TR >
< % rs.movenext
loop % >
< /TABLE >

< /BODY >
< /HTML >
ADO-HTML.asp
展現結果如下:

轉換為 XML 資料

上面的範例只是透過ADO取出資料,並且以RecordSet的型式存在,現在如果透過XML技術又該如何使用呢?首先要想辦法將RecordSet物件的資料轉換成XML格式,第一步先透過ADO取出RecordSet,如下:
< %
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")

conn.Open "Provider=SQLOLEDB;Initial Catalog=Pubs;Data Source=(local);User Id=sa;Password=;"
Set RS=Conn.Execute("Select * From titles")
% >
上面的程式中會取出SQL Server內附樣本資料庫Pubs裡Titles Table的所有的資料,接下來透過RecordSet物件的一個方法(Method)將資料儲存成檔案,如此一來,就能使用這份XML檔案來套用XSL達到多樣化的展現(請參考前兩期XSL技術介紹)。
另外,在儲存之前先判斷檔案是否存在?所以透過檔案系統物件(FileSystemObject)來做判斷,如果已經存在便刪除檔案,否則儲存時會發生錯誤,最後使用RS.save將檔案寫入,要記得將檔案目錄的權限開啟允許寫入,否則也會發生錯誤,程式範例如下:
< %
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
'必須先開啟此folder的權限
filename = "c:/temp.xml"
'判斷檔案是否存在,如果存在便刪除此檔案
If FSO.FileExists(filename) Then
FSO.DeleteFile(filename)
End If

RS.Save filename,1
% >
儲存完畢後會產生temp.xml檔案,結果如下:
這份XML檔案包含兩大部分,一部分是XML Schema,也就是< s:Schema id="RowsetSchema" >區段,這部分會描述出XML資料的結構,內容如下圖:
例如title_id欄位資料的是以XML的Attribute(屬性)方式描述,資料型態是string,最大字元是6。另一部分是XML資料內容,也就是 < rs:data >區段,透過< z:row >區段當中的Attribute描述各欄位的資料,例如第一個< z:row >區段內的資料便是RecordSet裡的第一筆Record,如下:

ASP 與ADO 與XML 與XSL 之一

接下來試著將temp.xml套用一份XSL檔案,也就是在temp.xml加上套用的語法:
< ?xml-stylesheet type="text/xsl" href="titles.xsl"? >
XSL檔案titles.xsl內容如下:
< ?xml version="1.0" encoding="big5"? >
< xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" >
< xsl:template match="/" >
< HTML >
< HEAD >
< /HEAD >
< BODY >
< TABLE border="0" cellpadding="3" cellspacing="3" >
< TR >
< TH style="background-color:beige" >書號< /TH >
< TH style="background-color:beige" >書名< /TH >
< TH style="background-color:beige" >分類< /TH >
< TH style="background-color:beige" >單價< /TH >
< /TR >
  < xsl:for-each select= "//z:row" order-by="@title" >
< TR VALIGN="top"
onmouseover="this.style.backgroundColor='lightcyan'"
onmouseout="this.style.backgroundColor='white'"
style="background-color:white;cursor:hand" >
< TD >< xsl:value-of select="@title_id"/ >< /TD >
< TD >< xsl:value-of select="@title"/ >< /TD >
< TD >< xsl:value-of select="@type"/ >< /TD >
< TD >< xsl:value-of select="@price"/ >< /TD >
< /TR >
< /xsl:for-each >
< /TABLE >
< /BODY >
< /HTML >
< /xsl:template >
< /xsl:stylesheet >
titles.xsl
由於temp.xml當案的資料內容都是放在標籤底下的屬性,所以透過迴圈來抓出每一筆資料,並且使用語法取出需要的欄位資料,套用結果如下:

ASP 與ADO 與XML 與XSL 之二

這種方式雖然可以產生所需的XML檔案資料,但是還必須自己幫temp.xml檔案加上套用titles.xsl檔案來展現,的確稍嫌麻煩,是否能夠直接產生結果展現會比較好呢?沒錯,靜態的檔案還是比不上動態產生的結果。最好是取出資料便能夠直接用程式套用XSL並且直接展現,這該如何做到呢?
其實做法很簡單,範例如下:
< %
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")

conn.Open "Provider=SQLOLEDB;Initial Catalog=Pubs;Data Source=(local);User Id=sa;Password=;"
Set RS=Conn.Execute("Select title_id,title,type,price From titles")

'指定回應到Client的資料為XML格式
Response.ContentType="text/xml"
Response.Write "< ?xml version=""1.0"" encoding=""Big5""? >"

Response.Write "< Jerry >"
do while not rs.EOF
Response.Write "< Record "
for i=0 to rs.Fields.Count-1
Response.Write rs.Fields(i).Name & "="""
Response.Write rs(i)
Response.write """ "
next
Response.Write " / >"
rs.MoveNext
loop
Response.Write "< /Jerry >"
% >
ADO-XML.asp
透過Response.ContentType="text/xml"指令,改變回應給Client端的資料為XML格式而非HTML,並利用ASP迴圈語法取出資料並定義XML標籤,當Client端的瀏覽器接收到結果時,便以XML文件的展現方式來處理,結果如下:
接下來只要在程式中再加上一列指令,如下:
'在Process Introduce下方加上套用XSL語法
Response.Write "< ?xml version=""1.0"" encoding=""Big5""? >"
Response.Write "< ?xml-stylesheet type=""text/xsl"" href=""titles2.xsl""? >"
而這裡所套用的titles2.xsl只需要從titles.xsl改變一個地方即可使用,如下:
titles.xsl的迴圈語法抓出所有的資料:
< xsl:for-each select="//z:row" order-by="@title" >

改寫為titles2.xsl的抓所有資料:
< xsl:for-each select="//Record" order-by="@title" >
如此一來,在程式中便能決定要套用的是哪一份XSL檔案,並且能夠直接展現,結果便與圖五相同了,差別就在於不需手動套用XSL檔案,而且是動態取得資料來展現,當然也能夠動態套用XSL檔案囉。
另外,或許這些XML標籤並不想用欄位的名字,當然也可以經由迴圈來產生所需的XML標籤,如下:
Response.Write "< Jerry >"
do while not rs.EOF
Response.Write "< Record >"
Response.Write "< Column1 >" & rs("title_id") & "< /Column1 >"
Response.Write "< Column2 >" & rs("title") & "< /Column2 >"
Response.Write "< Column3 >" & rs("type") & "< /Column3 >"
Response.Write "< Column4 >" & rs("price") & "< /Column4 >"
Response.Write "< /Record >"
rs.MoveNext
loop
Response.Write "< /Jerry >"
結果如下圖:

結論

看過了以上幾個範例,讀者應該可以了解如何轉換成所需的XML資料,如何讓資料更具彈性,如何使用XSL來展現等等。這些使用ASP以及ADO所轉換的XML資料,相信是所有開發XML Based Web Application的第一步。基本上只要有ASP的開發經驗,運用起來就可以很順手。
在這三期的範例當中,漸漸結合了資料庫及XSL的展現,但是沒有學習過XSL語法的讀者也許會覺得撰寫XSL很麻煩且不熟悉,是否有其他比較簡單方式來展現XML資料呢?最好能不用寫XSL檔案就能達到相同的結果,因為或許有時候資料需要的並非多樣的展現,而是簡單且快速地產出。
的確,XSL語法必須要學過才有辦法撰寫,XML的相關技術中另外有一種稱之為Data Binding(資料繫結)的技術,可以讓我們用設定HTML屬性的方式來展現資料,不但可以不用撰寫XSL語法,又能夠快速展現資料,使用上又簡單,甚至可以有資料列表的換頁功能等等。
讀者可能會問,既然Data Binding這麼好用,那為何還需要XSL呢?當然方便的東西還是有其不方便的地方,預知詳情,下回分曉囉!
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:135006次
    • 积分:1631
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:74篇
    • 译文:0篇
    • 评论:21条
    文章分类
    最新评论