XML被譽為未來Web的生命所在。本文介紹如何在服務器端利用新的XML文檔對象模型(DOM),通過ASP程序解析和應用XML數據。
一、文檔對象模型
在服務器上解析和應用XML的能力為開發者打開了一個全新的世界。隨著XML應用的日益廣泛,在服務器上處理XML也變得更加重要。本文示范ASP應用在服務器端的XML文檔處理過程,使用的XML例子是一個新聞文檔。我們將介紹如何編寫一個顯示新聞文檔日期和新聞數量的簡單ASP頁面,以及如何在ASP頁面中顯示新聞標題和相應的URL。
文檔對象模型即Document Object Model,簡稱DOM。IE 5.0的XML文檔對象模型提供了對W3C DOM核心規范(Level 1)所描述的編程接口的完整支持,同時它還支持一系列XML相關技術,比如XSL、XSL模式匹配、名稱空間、數據類型等。DOM是XML解析器所導出的最基本的文檔模型,它將XML文檔描述為一個很容易導航和使用的樹形結構。
W3C的DOM核心規范定義了兩組DOM編程接口。第一組接口是編寫處理和使用XML文檔的應用時所必需的,第二組接口輔助開發者更輕松地處理XML文檔。提供第二組接口只是為了方便,對於XML應用來說它們並不是必需的。
在ASP應用中,要在服務器上應用DOM是相當簡單的,但服務器上必須安裝IE 5.0,這是因為DOM的許多支持組件都是由IE提供的。安裝好IE之後,只要在ASP應用中用類似下面的代碼就可以創建DOM對象:<% Set objXML = Server.CreateObject("Microsoft.XMLDOM") %>
二、在服務器上處理XML(1)
在服務器上創建了DOM對象之後,我們既可以自己構造新的XML文檔,也可以裝載一個現有的文檔。如果是裝載現有文檔,還可以選擇是讀取XML文本字符串,還是打開XML文檔並裝載其內容。在本文的例子中,我們假定服務器上已經有了一個最近新聞的XML文檔mostRecentScriptingNews.xml。在裝載XML文檔之前,我們應該把DOM對象的async屬性設置成“false”,這是告訴DOM對象裝載XML文檔不是異步進行。這一點非常重要,因為讀入XML文檔之後我們將立即開始使用它,如果此時文檔還沒有全部裝載完畢,試圖訪問它就會引發錯誤。<%
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = False
objXML.Load (Server.MapPath("mostRecentScriptingNews.XML"))
%>
下面是我們裝載的XML文檔mostRecentScriptingNews.XML:<?XML version="1.0" encoding="gb2312" ?>
<!DOCTYPE scriptingNews SYSTEM
"http://www.scripting.com/dtd/scriptingNews.dtd">
<scriptingNews>
<header>
<copyright>版權所有</copyright>
<scriptingNewsVersion>1.0</scriptingNewsVersion>
<pubDate>Wed, 03 Mar 1999 08:00:00 GMT</pubDate>
<lastBuildDate>Thu, 04 Mar 1999 03:37:03 GMT</lastBuildDate>
</header>
<item>
<text>Linux汽車立體聲系統</text>
<link>
<url>http://www.wired.com/news/news/technology/story/18236.Html
</url>
<linetext>汽車立體聲系統</linetext>
</link>
</item>
...
<item>
<text>據News.com,HP將以租用方式提供存儲和計算服務。</text>
<link>
<url>http://www.news.com/News/Item/0,4,33202,00.Html?st.ne.fd.mdh
</url>
<linetext>摘自News.com</linetext>
</link>
</item>
</scriptingNews>
DOM模型的parseError對象包含了最後出現的解析錯誤信息,這個錯誤對象對於ASP頁面調試和錯誤控制是很有用的。文檔裝載完成後,在繼續其他操作之前檢查parseError對象看看是否存在錯誤是一種好習慣:<%
If objXML.parseError.errorCode <> 0 Then
&single; 處理錯誤
End If
%>
parseError對象提供了有關錯誤的豐富而寶貴的信息:
在本例中,XML文檔引用了一個DTD(Document Type Definition,文檔類型定義)文件,parseError在此具有更重要的意義。在這裡,如果要求不出現錯誤,那麼XML文檔不僅必須格式良好(Well formed),而且它還必須對於指定DTD定義來說合法。裝載XML文檔之後總是檢查一下parseError對象是一個好的編程習慣。
二、在服務器上處理XML(2)
現在DOM對象中已經有了一個格式良好的、合法的文檔,我們來看看這個文檔裡面有些什麼。DOM提供許多精確分析文檔內容的方法。由於DOM將文檔內容描述成一棵嵌套節點所組成的樹(每個節點由一個元素及其所有子元素構成),因此處理XML數據實際上歸結為處理一系列的節點對象。下面我們將用getElementsByTagName方法從文檔獲得元素(或節點)。
我們的第一個目標是找出新聞的發布日期。分析DTD文件,我們知道發布日期放在pubDate節點。訪問該節點內容的一種比較簡單的方法是,首先創建一個XML文檔內所有節點的列表對象,然後用循環遍歷這個列表直至找到pubDate節點。由於DTD規定了pubDate節點不能包含任何子節點,我們可以通過text屬性直接得到節點的內容。<%
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
Set objLst = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = False
objXML.Load (Server.MapPath("mostRecentScriptingNews.XML"))
If objXML.parseError.errorCode <> 0 Then
&single; 處理錯誤
End If
Set objLst = objXML.getElementsByTagName("*")
For i = 0 to (objLst.length ?1)
If objLst.item(i).nodeName = "pubDate" Then
StrDate = objLst.item(i).text
Exit For
End If
Next
%>
注意在上面的代碼中我們以“*”作為getElementsByTagName的參數,此時getElementsByTagName將返回文檔中所有元素(或節點)的一個列表。由於我們已經有了DTD,可以直接從DTD獲知pubDate的正確位置,但象上例所做的那樣通過循環遍歷文檔也是一種高效的方法,因為節點列表是一個集合。
現在我們得到了新聞的發布日期,下面我們來看看如何計算文檔中的新聞數量。從文檔的DTD定義我們知道新聞存放在item節點,文檔中的每個item節點對應一則新聞。顯然,我們可以使用類似上例的另一個循環,在循環內每次遇到item節點就把計數器加1。不過我們還有一種更好的提取該信息的方法,這要用到DOM提供的另外一個方法。
象上例一樣,我們所要做的是創建一個包含全部item節點的列表對象,然後通過length屬性得到節點列表對象中的節點數量,從而也就得到了文檔中新聞的數量:<%
Set objLst = objXML.getElementsByTagName("item")
strNoOfHeadlines = objLst.Length
%>
很多時候我們要在ASP頁面中顯示來自XML文檔的一些信息。下面這個例子顯示了如何通過遍歷新聞節點列表,在ASP頁面中顯示新聞及其URL。<%
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
Set objLst = Server.CreateObject("Microsoft.XMLDOM")
Set objHdl = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = False
objXML.Load (Server.MapPath("mostRecentScriptingNews.XML"))
If objXML.parseError.errorCode <> 0 Then
&single; 處理錯誤
End If
Set objLst = objXML.getElementsByTagName("item")
noOfHeadlines = objLst.length
%>
<Html><BODY>
<H1>新聞</H1>
<%
For i = 0 To (noOfHeadlines ?1)
Set objHdl = objLst.item(i)
Response.Write("<a href=""" & _
objHdl.childNodes(1).childNodes(0).text & _
""">" & objHdl.childNodes(0).text & _
"</a><br>")
Next
%>
</BODY></Html>
結束語:只要對XML文檔的結構有一個基本了解,再利用DOM的強大功能,我們就可以方便地在ASP應用服務器端解析XML文檔,從解析結果中選擇合適的內容發送給客戶端。這是一種浏覽器無關的方法,適用於幾乎所有的Web浏覽器。