XML與ASP程式設計(一) (轉)
將資料組合進應用的時候,需要做的第一件事是訪問XML的內容。從技術上來說,在ASP環境中,讀入並管理XML文字的主要方法有三種:
建立MSXML,並且將XML文件載入;
使用端嵌入(Server-S Include,SSI);
就如同訪問其他文字檔案一樣,使用FileSystem來訪問XML文件;
第四種方法是在客戶端建立內建的資料島,有關的內容以後講解。
一、使用DOM
為了在ASP程式碼中使用DOM,需要建立一個 XML分析器的例項,它像任何別的COM一樣被例項化,在頁面的開始處頊要增加幾行標準程式碼。這些程式碼建立一個分析器例項,載入XML文件至DOM,並且將根元素(即文件元素)設定為當前節點。
‘Instatiate the XML Processor
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
'Load the XML Document
objXML.load(Server.MapPath("mydata.xml")
'Set the Document Element
Set objElement = objXML.documentElement
在XML文件被載入之前,還需要第四步,即設定validateOnParse屬性為True,這可確保被載入的文件為有效的XML文件。這可避免後面遇到的各種麻煩:
'Instatiate the XML Processor
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
'The processshould validate the document
objXML.validateOnParse = True
'Load the XML Document
objXML.load(Server.MapPath("mydata.xml")
'Set the Document Element
Set objRootElement = objXML.documentElement
最後,還有一個可選步驟,它也是出現在載入之前。它要求同步載入檔案:
objXML.async = false
這說時載入並驗證一個相當大的檔案需要佔用一些時間。另一種替換方案是忽略這一步,允許非同步載入,這是預設情況,一旦完成這些初始化步驟,XML文件就被載入,並且做好了被處理的準備。DOM所有重要的功能都是可的。
當然,就如同任何COM物件一樣,在使用完之後,請記住必須銷燬它:
Set objXML = nothing
二、伺服器端嵌入
伺服器端嵌入可用於將XML文件程式碼插入ASP頁面。
三、用ASP程式碼處理XML的示例
Dim File,source,rootElement,HTMLCode
sourceFile = Request.ServerVariables("APPL_PHYSICAL_PATH") & "xmlcontacts.xml"
set source = Server.CreateObject("Microsoft.XMLDOM")
source.async = false
source.load sourceFile
set rootElement = source.documentElement
HTMLCode = HTMLCode & ""
HTMLCode = HTMLCode & rootElement.childNodes(0).text
HTMLCode = HTMLCode & ""
HTMLCode = HTMLCode & rootElement.childNodes(0).text
HTMLCode = HTMLCode & ""
HTMLCode = HTMLCode & rootElement.childNodes(0).text
HTMLCode = HTMLCode & ""
response.write(HTMLCode)
set source = nothing
%>
contacts.xml
經格式化的XML資料
styleContact.asp
sourceFile = server.mapPath("contact.xml")
styleFile = server.mapPath("contact.xsl")
set source = Server.CreateObject("Microsoft.XMLDOM")
source.async = False
source.load(sourceFile)
set style = Server.CreateObject("Microsoft.XMLDOM")
style.async = False
style.load(styleFile)
response.write(source.tranormNode(style))
%>
contact.xml
contact.xsl
其它示例:
1、連結
Dim objXML, objRootElement, strLinkName, strLinkURL, strLinkTarget, sourceFile, i
sourceFile = Request.ServerVariables("APPL_PHYSICAL_PATH") & "xmlLinks.xml"
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.validateOnParse = True
objXML.async = false
objXML.load(sourceFile)
set objRootElement = objXML.documentElement
for i = 0 to objRootElement.childNodes.length-1
strLinkName = objRootElement.childNodes.item(i).text
strLinkURL = objRootElement.childNodes.item(i).getAttribute("url")
strLinkTarget = objRootElement.childNodes.item(i).getAttribute("target")
response.write("" & strLinkName & "
")
next
set objXML = nothing
%>
Links.xml
Front Page 0
Front Page 1
Front Page 2
Front Page 3
2、XML檔案的生成
gen_xml.asp
' Create an empty root node for the document.
Set rootNode = Server.CreateObject("ml.AspXml")
rootNode.Encoding = "ISO-8859-1"
rootNode.Standalone = "yes"
rootNode.Tag = "table"
for row = 1 to 10
Set rowNode = rootNode.NewChild("row","")
for col = 1 to 10
Set colNode = rowNode.NewChild("column","("&col&","&row&")")
next
next
rootNode.SaveXml(Server.MapPath("table.xml"))
Set rootNode = Nothing
%>
3、向XML檔案中追加結點
addItem.asp
If request.ServerVariables("REQUEST_METHOD")="POST" Then
call writeXML
Else
call showForm
End If
Sub showForm
%>
Please enter the persons contact details
Name: E:
End Sub
Sub writeXML
' find xml file path
Dim strFilename,strXMLFile
strFilename = "contacts.xml"
strXMLFile=server.mapPath(strFilename)
' standard "create xml object" code
set oXML = server.createObject("Microsoft.XMLDOM")
oXML.async = False
' check file exists
bitFileExists = oXML.load(strXMLFile)
If bitFileExists Then
tmpChildnodes = oXML.documentElement.childnodes.length - 1
intCurrentRecord = tmpChildnodes + 1
Else
' create xml
oXML.appendChild(oXML.createProcessingInstruction("xml","version=""1.0"""))
oXML.appendChild(oXML.createElement("contacts"))
intCurrentRecord = 0
End If
' create record
set oXMLRec = oXML.createElement("contact")
'Create an id attribute
Set oAtt = oXML.createAttribute("id")
oAtt.Text = intCurrentRecord
oXMLRec.setAttributeNode oAtt
' set remaining fields
' name
oXMLRec.appendChild(oXML.createElement("name"))
oXMLRec.childnodes(0).text = request.form("name")
' email address
oXMLRec.appendChild(oXML.createElement("email"))
oXMLRec.childnodes(1).text = request.Form("email")
' date stamp
oXMLRec.appendChild(oXML.createElement("created"))
oXMLRec.childnodes(2).text = now()
' write new record
oXML.documentElement.appendChild(oXMLRec.cloneNode(True))
' save file
oXML.save strXMLFile
' redirect to xml file
response.redirect(strFilename)
oXML = nothing
End Sub
%>
contacts.xml
4、留言薄
username=request.form("username")
if username<>"" then
fromwhere =request.form("fromwhere")
homepage =request.form("homepage")
email =request.form("email")
text =Server.URLEncode(request.form("text"))
Posttime =now()
sourceFile = "list.xml"
strSourceFile = Server.MapPath(sourceFile)
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
blnRet = objXML.load(strSourceFile)
If blnRet Then
Set objRootlist = objXML.documentElement
if objRootlist.hasChildNodes then
id = objRootlist.lastchild.firstchild.text+1
else
id=1
end if
Else
objXML.appendChild(objXML.createProcessingInstruction("xml","version=""1.0"""))
set objRootlist = objXML.createElement("NewList")
objXML.appendChild(objRootlist)
id = 1
End If
brstr=chr(13)&chr(10)&chr(9)
XMLnode=brstr&""&brstr & _
"&chr(13)
"
"
"
"
"
"
"
"
set objXML2=Server.CreateObject("Microsoft.XMLDOM")
objXML2.loadXML(XMLnode)
set rootNewNode=objXML2.documentElement
objRootlist.appendChild(rootNewNode)
objXML.save(strSourceFile)
set objXML=nothing
set objXML2=nothing
response.redirect(strSourceFile)
end if
%>
四、使用DOM生成XML總結
瞭解XML文件物件模型
XML DOM包含四個主要物件:XMLDOMDocument, XMLDOMNode,XMLDOMNodeList和XMLDOMNamedNodeMap。同任何其它物件模型一樣,每個XML DOM物件有其自己的特性和方法。本文,我們將主要介紹XMLDOMDocument 和XMLDOMNode 物件。
XMLDOMDocument物件
XMLDOMDocument物件代表XML DOM層次中的頂層結點(請不要同XML文件中的根結點混淆)。它是建立和操縱XML結構的基礎。為了建立XMLDOMDocument物件變數,請使用如下的CreateObject 命令:
Set objXMLdoc = CreateObject("Microsoft.XMLDOM")
表A:列出了在建立了XMLDOMDocument的物件後,我們可以得到的一些特性和方法。
方法 描述
CreateAttribute 建立新屬性
CreateCDATASection 建立DATA 部分結點
CreateComment 建立註釋結點
CreateElement 使用指定名稱建立元素結點
CreateEntityReference 建立實體參考物件
CreateNode 建立結點
CreateTextNode 建立文字結點
Load 載入已有的 XML 文件
Save 儲存XML 文件
特性 描述
PreserveWhiteSpace 指示是否在XML文件中顯示空格t
ResolveExternals 解析名域,DTD和外部實體
ValidateOnParse 指示解析器是否對文件進行合法性檢查
DocumentElement 返回XML 文件的根結點
設定執行選項
正如你在表A中所看到的,只有建立了XMLDOMDocument 物件,你才可建立單個的XML結點。在做這個工作之前,你還可以設定XML文件的解析執行條件,如果你打算直接生成XML文件到時,就很有用處。
執行選項可以讓你設定非同步,提供文件合法性檢查和保留空格,以及解析外部索引。為了防止非同步下載,可設定asynch特性為False。如果打算用一行新字元代替空格,可設定PreserveWhiteSpace 特性為True。 ResolveExternals特性可防止解析引擎解析外部實體索引,文件型別定義或者外部名域。
1、建立結點
XMLDOMDocument 物件提供了建立結點或者XMLDOMNode的兩種方法: CreateElement 和CreateNode。選擇其中哪一種方法,取決於你需要結點提供資訊量的多少。當你使用CreateElement 方法時,只要提供結點名稱,如
Set objXMLroot = objXMLdoc.CreateElement("ORDER_STATUS")
當使用CreateNode 方法時,你要指定結點型別,結點名稱和相關名域。(XML名域可以讓你擇同一文件中用同一名稱建立多個XML元素) 例如,如果要使用CreateNode方法,你可寫出如下程式碼:
Set objXMLroot = objXMLdoc.createNode("element","ORDER_STATUS","Space1")
一旦建立了結點,你須把它新增進XML文件中。這就要用AppendChild 方法,例如,繼續上面的例子,你可以寫出:
objXMLdoc.AppendChild(objXMLroot)
該語句建立了XML根結點。
除了AppendChild方法外,XMLDOMNode 物件也具有其它三個控制XML結點的方法: ReplaceChild, RemoveChild和InsertBefore
2、對結點的屬性賦值
一旦建立了結點,還要對其屬性賦值,如獨立的識別符號,或者特性值。你要用到SetAttribute方法。該方法接收兩個引數— 屬性名和屬性值。例如,下列程式碼建立了屬性名SHIP_DATASOURCE 和屬性值NORTH_ATLANTIC_SHIPPING:
objXMLroot.SetAttribute "SHIPPING_DATASOURCE","NORTH_ATLANTIC_SHIPPING"
此時,我們生成了一個XML文件,SetAttributes方法建立了結點屬性 。
3、加入子結點
要建立子結點,你可以使用我們前面介紹的CreateElement或者 CreateNode 方法,然後把它們新增到合適的父母結點中。例如,假設,我們要建立稱為PUBLISHER_DISCLAIMER的XML結點。為了做到這一點,我們把該結點附加到文件的根結點中,程式碼如下:
Set objXMLChildTestNode = objXMLdoc.createNode("element","PUBLISHER_DISCLAIMER","")
objXMLdoc.DocumentElement.appendChild(objXMLChildTestNode)
注意:我們使用了XMLDOMDocument的 DocumentElement 特性來把新結點新增到XML文件的根結點中,要新增子結點,你只需把它們新增到父母結點中。
4、給結點賦值
一旦建立完所有的結點,你將需要給它們賦值。那是XML最關鍵的步驟。要做到這點,你同平常一樣,建立一個結點,然後對該結點的TEXT屬性賦值。例如,下列程式碼建立了稱為PUBLISHED_DATE的XML結點,然後賦值如下:
Set objPublishDate = objXMLdoc.CreateNode("element","PUBLISHED_DATE","")
dShippedDate = FormatDateTime(Date,2)
objPublishDate.Text = dShippedDate
objXMLChildTestNode.appendChild(objPublishDate)
我們對把當前日期賦給PUBLISHED_DATE的Text屬性,然後把該結點新增到PUBLISHER_DISCLAIMER元素中。
5、在ASP下使用XML DOM
要生成前面例子中的XML文件,我們可以用ASP來生成。我們將建立一個簡單的ASP頁,讓你只需點選按鈕,就可建立XML文件。為了完成這件事情,我們用了帶有指令碼構件的ASP網頁,由它來生成XML。我們將用Windows Script Component Wizard來生成初始程式碼。(如果你沒有wizard,可到的指令碼欄目中去尋找。)
(1)建立指令碼元件
開始時執行Windows Script Component Wizard。在第一個視窗中,輸入XMLDom 作為元件名稱,然後單擊Next。確信和支援Active Server Pages選項在第二個視窗中被選中,然後單擊Next兩次。在第四個視窗,輸入CreateXML,作為我們的指令碼物件的唯一方法。再單擊Next 兩次,最後再點選Finish。完成了這些事情後, wizard 就建立了元件,並把元件新增到你的桌面上。
此時,我們獲得了元件的基本結構,但它並不包含任何功能,所以還要新增功能。要做到這點,雙擊位於桌面的XMLDom 的。完成後,Windows 在記事本上顯示出初始程式碼。注意元件本身是個XML文件。要新增CreateXML 程式碼,我們將建立一個子過程來代替。所以,刪除下面的行
function CreateXML()
CreateXML = "Temporary Value"
end function
在該處輸入列表A中的程式碼
(2)構造ASP網頁
為了建立ASP網頁,開啟你所熟悉的HTML 編輯器,輸入列表B中的程式碼。確保 Window.Navigate行指向合適的資料夾。要了解其是如何工作的,在Inte Explorer中開啟該頁。一旦開啟後,就會出現一個資訊,告訴你XML已經建立了成功,並出現一個 Show 按鈕,點選該按鈕。
XML DOM 庫中更多內容
正如你在樣本程式碼中所見,XML DOM 包含了比我們此處所介紹的更多的方法和屬性。要查詢完整的XML文件物件模型,請訪問有關微軟網站。同時,如何你想了解XML DOM以及XSL和ASP的高階用法的例子,請訪問。
結論
1、XML正在迅猛發展,同以往的以文字為中心的網頁相比,XML的資料模型結構提供了更多的功能, XML文件物件模型透過化的方式,可以為你建立XML文件。本文中,我們對XML DOM作了性的介紹,並且演示瞭如何在Active Server Pages中使用XML DOM。
2、寫XML檔案的步驟:
(1)、物件生成
set obj = Server.CreateObject("Microsoft.XMLDOM")
(2)、載入XML檔案
obj.load(sourceFileXML)
(3)、原XML檔案中的結點的取得
set objRootList = obj.documentElement
(4)、物件生成
set objNew = Server.CreateObject("Microsoft.XMLDOM")
(5)、載入新結點
objNew.LoadXML(strNewNode)
(6)、新結點取得
RootNewNode = objNew.documentElement
(7)、將第(6)步取得的新結點載入到第(3)步取得的結點的後面
objRootList.appendChild(RootNewNode)
(8)、儲存XML檔案
obj.save(sourceFileXML)
(9)、釋放生成的物件
set obj = nothing
set objNew = nothing
五、XML對大小寫是敏感的
而在XML中,所有的元素都必須要有一個結束標記,如:
This is a paragraph
This is another paragraph
注意:從前面的例子中你可能已經注意到了,XML宣告沒有結束標記。這並不是一個錯誤。因為宣告並不是XML文件的一部分。它不是一個XML元素,因此它不能有結束標記。
XML對大小寫是敏感的,這一點不象HTML。在XML中,標記
所有的XML元素都必須合理巢狀
如果標記的巢狀不合理,在XML中是沒有意義的。 在HTML中,有些元素可以被不適當地彼此巢狀,例如:
This text is bold and italic
而在XML ,所有元素都必須彼此合理地巢狀,例如:
This text is bold and italic
所有的XML文件都必須要有一個根標記
在一個XML文件中的第一個標記就是根標記。 所有的XML文件都必須包含一個標記對來定義根元素。所有的其他元素都必須巢狀到根元素裡面。 所有的元素都可以有子元素。子元素都必須正確地巢狀到母元素中。
必須將屬性值引起來
在XML中,在屬性值周圍省略引號是的。 同HTML一樣,XML元素的名/值對中可以有屬性。在XML中,屬性值必須引起來。看看下面的兩個XML文件。 第一個是正確的,第二個是錯誤的:
Don't forget me this weekend!
Don't forget me this weekend!
文件中的第一個錯誤是在note 元素中的資料屬性沒有引起來。 這樣是正確的: date="12/11/99"。 這樣是錯誤的: date=12/11/99。
在XML中,空格是保留的
在XML中,文件的空格不能被刪除。 這一點不象HTML。在HTML中,這樣一句話: Hello my name is Tove, 將被顯示成這樣: Hello my name is Tove, 因為HTML 把空格除去了。
在XML中, CR / LF被轉換成 LF
在XML中, 一個新行通常被為 LF。 你知道什麼是打字機嗎?打字機是上個世紀使用的一種打字機器裝置。 當你在打字機上打了一行以後,你要手動回車到左邊的空白,然後手動進紙。 在Windows 應用程式中,文字中的新一行通常儲存為CR LF 字元對。在 應用程式中,新的一行通常被儲存為一個LF字元。而有些應用程式只用一個CR字元來儲存新行。
參考文獻:
[1]《asp與xml高階程式設計》
----------------
作者:周志豐(大連)
日期:2003年5月14日
Email:
----------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956620/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- XML 程式設計思想:XML語義(轉)XML程式設計
- XML 程式設計思想:XML和語義(轉)XML程式設計
- XML 程式設計思想: 研讀XML Hacks(轉)XML程式設計
- XML 程式設計思想: XML 語義錨(轉)XML程式設計
- XML 程式設計思想: Harold 的高效 XML 設計原則(轉)XML程式設計
- 論Asp與XML的關係(轉)XML
- XML 程式設計思想:XML 建模藝術描述(轉)XML程式設計
- XML程式設計例項(二) (轉)XML程式設計
- XML 程式設計思想: 專利編檔遭遇 XML(轉)XML程式設計
- XML 程式設計思想:查詢 XML 格式的 WordNet(轉)XML程式設計
- XML 程式設計思想: XMLOpen 會議,再評 XML Hacks(轉)XML程式設計
- XML 程式設計思想:XML和語義:XML 會兌現其承諾嗎?(轉)XML程式設計
- XML 程式設計思想:從書本學習 XML Topic Maps(轉)XML程式設計
- XML 程式設計思想:Thinking XML: 通用商業語言(UBL)(轉)XML程式設計Thinking
- 使XML程式設計更簡單---JDOM介紹及程式設計指南 (轉)XML程式設計
- XML 程式設計思想:使用 XSLT 生成 RDF(轉)XML程式設計
- XML 程式設計思想: 學習物件後設資料(轉)XML程式設計物件
- shell vbscript xml程式設計XML程式設計
- XML 程式設計思想:用 MusicBrainz 管理後設資料(轉)XML程式設計AI
- Java的網路功能與程式設計 一 (轉)Java程式設計
- XML 程式設計思想:重新審視 XML 中的語義透明性(轉)XML程式設計
- XML 程式設計思想:知識管理的基本 XML 和 RDF 技術(7)(轉)XML程式設計
- 程式設計師與MM (轉)程式設計師
- 並口與程式設計 (轉)程式設計
- XML 程式設計思想:踏著語義的節拍(轉)XML程式設計
- asp程式設計經驗談:ASP檔案中的安全問題(轉)程式設計
- 程式設計修養(一) (轉)程式設計
- Java XML程式設計例項解析JavaXML程式設計
- XML 程式設計思想: UBL 1.0(以及 ebXML Core Components 等)(轉)XML程式設計
- XML 程式設計思想:知識管理的基本 XML 和 RDF 技術:問題跟蹤程式模式(轉)XML程式設計模式
- ASP 程式設計中 15 個非常有用的例子 (轉)程式設計
- XML 程式設計思想:知識管理的基本 XML 和 RDF 技術:語義知識(轉)XML程式設計
- ADO資料與XML資料間的轉換的類(ASP實現) (轉)XML
- XML 程式設計思想:定義 RDF 和 DAML+OIL 圖示(轉)XML程式設計
- Linux程式設計之一(轉)Linux程式設計
- 在ASP.NET中物件導向的程式設計思想 (轉)ASP.NET物件程式設計
- XML 在 ASP 環境下的應用(轉)XML
- 對 ASP.NET 非同步程式設計的一點理解ASP.NET非同步程式設計