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

转载 2006年06月03日 17:57:00
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呢?當然方便的東西還是有其不方便的地方,預知詳情,下回分曉囉!

XML Schema <第三篇>

XML Schema   验证XML文档是否符合议定的XML结构有两种方法,分别是DTD模式与XML Schema。本文主要介绍XML Schema。 一、XML Schema的优点 ...
  • ainyko
  • ainyko
  • 2015年07月14日 20:26
  • 182

Maven第三篇【Maven术语、pom.xml介绍】

maven术语在我们上一篇中已经知道了在Intellij idea下是如何使用Maven的了,创建出来的目录结构是这样子的:上面的目录结构就是Maven所谓的”约定“,我们使用Maven来构建Java...
  • hon_3y
  • hon_3y
  • 2017年08月08日 21:40
  • 135

Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

前言在写完Spring第二和第三篇后,去读了Spring In Action这本书…发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写…通过java代码配置bean由于Spring...
  • hon_3y
  • hon_3y
  • 2017年05月11日 19:38
  • 339

XML基础教程-电子教案.rar

  • 2008年12月26日 19:36
  • 418KB
  • 下载

C#递归算法-遍历XML文件,以UL列表显示树形结构目录

最近,公司有个新项目-用WEB做一个财报阅读器供客户使用。项目经理用Gmail给组员下发需求文档,我一看,功能需求很详细,但UI设计却只有支言片语。 于是我回复询问下UI需求,得到的回复是:UI设计...

基于XML的SVG应用指南-3

  • 2008年10月28日 16:33
  • 2.64MB
  • 下载

关于Android strings.xml-你应该了解的几个原则

来自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0303/7179.html 英文原文:Android str...

opencv学习笔记(二)-对xml和yaml文件的读写操作

一.xml和yaml的简单介绍        所谓的xml,就是eXtensible Markup Language, 翻译成中文就是“可扩展标识语言“。首先XML是一种元标记语言,所谓“元标记”就...

XML之初解 -1

w3cschool 学习笔记 1. XML是指的可扩展标记语言(Extensible Markup Language)。 XML是用来储存和传输数据 (HTML 是用来显示数据)。 XML的标...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XML第三篇:XML的泉源-ASP [转载]
举报原因:
原因补充:

(最多只允许输入30个字)