`
isiqi
  • 浏览: 16558303 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
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當案的資料內容都是放在<row>標籤底下的屬性,所以透過<for-each>迴圈來抓出每一筆資料,並且使用<value-of>語法取出需要的欄位資料,套用結果如下: </value-of></for-each></row>

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的迴圈語法抓出所有的<row>資料: <br><img height="10" src="http://www.msservermag.com.tw/member/article/images/0.gif" width="20" alt="">&lt; xsl:for-each select="//z:row" order-by="@title" &gt; <br><br>改寫為titles2.xsl的抓所有<record></record>資料:<br><img height="10" src="http://www.msservermag.com.tw/member/article/images/0.gif" width="20" alt="">&lt; xsl:for-each select="//Record" order-by="@title" &gt; </row>
如此一來,在程式中便能決定要套用的是哪一份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呢?當然方便的東西還是有其不方便的地方,預知詳情,下回分曉囉!
分享到:
评论

相关推荐

    simple-xml-safe-2.7.1-API文档-中文版.zip

    赠送jar包:simple-xml-safe-2.7.1.jar; 赠送原API文档:simple-xml-safe-2.7.1-javadoc.jar; 赠送源代码:simple-xml-safe-2.7.1-sources.jar; 赠送Maven依赖信息文件:simple-xml-safe-2.7.1.pom; 包含翻译后...

    scala-xml_2.12-1.0.6-API文档-中文版.zip

    赠送jar包:scala-xml_2.12-1.0.6.jar; 赠送原API文档:scala-xml_2.12-1.0.6-javadoc.jar; 赠送源代码:scala-xml_2.12-1.0.6-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.12-1.0.6.pom; 包含翻译后的API...

    jakarta.xml.bind-api-2.3.3-API文档-中文版.zip

    赠送jar包:jakarta.xml.bind-api-2.3.3.jar; 赠送原API文档:jakarta.xml.bind-api-2.3.3-javadoc.jar; 赠送源代码:jakarta.xml.bind-api-2.3.3-sources.jar; 赠送Maven依赖信息文件:jakarta.xml.bind-api-...

    cxf-rt-bindings-xml-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-bindings-xml-3.0.1.jar; 赠送原API文档:cxf-rt-bindings-xml-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-bindings-xml-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-bindings-xml-3.0.1....

    xml解析相关:xerces-c-3.2.3.tar、tinyxml_2_6_2、tinyxml2-master

    本主题将深入探讨三个知名的XML解析库:xerces-c-3.2.3、tinyxml_2_6.2以及tinyxml2。 1. xerces-c-3.2.3: xerces-c是一个开源的XML解析器,由Apache软件基金会维护。版本3.2.3是这个项目的一个稳定版本,提供了...

    eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd

    eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd

    xmlgraphics-commons-2.1-API文档-中文版.zip

    赠送jar包:xmlgraphics-commons-2.1.jar; 赠送原API文档:xmlgraphics-commons-2.1-javadoc.jar; 赠送源代码:xmlgraphics-commons-2.1-sources.jar; 赠送Maven依赖信息文件:xmlgraphics-commons-2.1.pom; ...

    netty-codec-xml-4.1.73.Final-API文档-中文版.zip

    赠送jar包:netty-codec-xml-4.1.73.Final.jar; 赠送原API文档:netty-codec-xml-4.1.73.Final-javadoc.jar; 赠送源代码:netty-codec-xml-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-codec-xml-...

    xmlgraphics-commons-2.1-API文档-中英对照版.zip

    赠送jar包:xmlgraphics-commons-2.1.jar; 赠送原API文档:xmlgraphics-commons-2.1-javadoc.jar; 赠送源代码:xmlgraphics-commons-2.1-sources.jar; 赠送Maven依赖信息文件:xmlgraphics-commons-2.1.pom; ...

    netty-codec-xml-4.1.74.Final-API文档-中文版.zip

    赠送jar包:netty-codec-xml-4.1.74.Final.jar; 赠送原API文档:netty-codec-xml-4.1.74.Final-javadoc.jar; 赠送源代码:netty-codec-xml-4.1.74.Final-sources.jar; 赠送Maven依赖信息文件:netty-codec-xml-...

    scala-xml_2.11-1.0.1-API文档-中文版.zip

    赠送jar包:scala-xml_2.11-1.0.1.jar; 赠送原API文档:scala-xml_2.11-1.0.1-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.1-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.1.pom; 包含翻译后的API...

    netty-codec-xml-4.1.74.Final-API文档-中英对照版.zip

    赠送jar包:netty-codec-xml-4.1.74.Final.jar; 赠送原API文档:netty-codec-xml-4.1.74.Final-javadoc.jar; 赠送源代码:netty-codec-xml-4.1.74.Final-sources.jar; 赠送Maven依赖信息文件:netty-codec-xml-...

    jakarta.xml.bind-api-2.3.3-API文档-中英对照版.zip

    赠送jar包:jakarta.xml.bind-api-2.3.3.jar; 赠送原API文档:jakarta.xml.bind-api-2.3.3-javadoc.jar; 赠送源代码:jakarta.xml.bind-api-2.3.3-sources.jar; 赠送Maven依赖信息文件:jakarta.xml.bind-api-...

    rh-php72-php-xml-7.2.24-1.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    xml-apis-1.4.01.jar.zip

    3. **版本冲突**:可能存在与其他库冲突的情况,比如项目中同时使用了不同版本的XML API实现。在这种情况下,需要检查并适当地解决依赖冲突,确保使用的XML API版本与项目兼容。 4. **环境配置问题**:在某些IDE...

    jackson-dataformat-xml-2.12.2-API文档-中文版.zip

    赠送jar包:jackson-dataformat-xml-2.12.2.jar; 赠送原API文档:jackson-dataformat-xml-2.12.2-javadoc.jar; 赠送源代码:jackson-dataformat-xml-2.12.2-sources.jar; 赠送Maven依赖信息文件:jackson-data...

    jetty-xml-9.4.11.v20180605-API文档-中英对照版.zip

    赠送jar包:jetty-xml-9.4.11.v20180605.jar; 赠送原API文档:jetty-xml-9.4.11.v20180605-javadoc.jar; 赠送源代码:jetty-xml-9.4.11.v20180605-sources.jar; 赠送Maven依赖信息文件:jetty-xml-9.4.11.v...

    jetty-xml-8.1.8.v20121106-API文档-中文版.zip

    赠送jar包:jetty-xml-8.1.8.v20121106.jar; 赠送原API文档:jetty-xml-8.1.8.v20121106-javadoc.jar; 赠送源代码:jetty-xml-8.1.8.v20121106-sources.jar; 赠送Maven依赖信息文件:jetty-xml-8.1.8.v20121106....

    jackson-dataformat-xml-2.12.2-API文档-中英对照版.zip

    赠送jar包:jackson-dataformat-xml-2.12.2.jar; 赠送原API文档:jackson-dataformat-xml-2.12.2-javadoc.jar; 赠送源代码:jackson-dataformat-xml-2.12.2-sources.jar; 赠送Maven依赖信息文件:jackson-data...

    jakarta.xml.bind-api-2.3.2-API文档-中文版.zip

    赠送jar包:jakarta.xml.bind-api-2.3.2.jar; 赠送原API文档:jakarta.xml.bind-api-2.3.2-javadoc.jar; 赠送源代码:jakarta.xml.bind-api-2.3.2-sources.jar; 赠送Maven依赖信息文件:jakarta.xml.bind-api-...

Global site tag (gtag.js) - Google Analytics