XML與ASP程式設計(一) (轉)

amyz發表於2007-08-14
XML與ASP程式設計(一) (轉)[@more@]

將資料組合進應用的時候,需要做的第一件事是訪問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


 
 JOHN
 111-1111-111
 

 
 SMITH
 222-2222-222
 

 
 MIKE
 333-3333-333
 


經格式化的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



 
 ZHOU.ZF
 11111111111
 

 
 LISTEN
 22222222222
 

 
 BUBU
 33333333333
 


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




Generate XML


 ' 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


 
 bubu
 zhou813@163.com
 /04/29 9:26:51
 

 
 22222
 222222222
 2003-5-12 18:15:41
 

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 & _
 ""&id&""&brstr & _
 ""&username&""&brstr & _
 ""&fromwhere&""&brstr & _
 ""&Posttime&""&brstr & _
 ""&homepage&""&brstr & _
 ""&email&""&brstr & _
 ""&text&""&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
%>


 Untitled Document
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
New Book
Name:
 **
 
ComeFrom:
 
 
WebSite:
 
 
Email:
 
 
Context:
 
 

 
 
 



四、使用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中,標記 和標記 是不一樣的。 因此,開啟和結束標記的大小寫應該寫成相同的:
 
     This is incorrect
     This is correct
 
     所有的XML元素都必須合理巢狀
 
     如果標記的巢狀不合理,在XML中是沒有意義的。 在HTML中,有些元素可以被不適當地彼此巢狀,例如:
 
     This text is bold and italic
 
     而在XML ,所有元素都必須彼此合理地巢狀,例如:
 
     This text is bold and italic
 
     所有的XML文件都必須要有一個根標記
 
     在一個XML文件中的第一個標記就是根標記。 所有的XML文件都必須包含一個標記對來定義根元素。所有的其他元素都必須巢狀到根元素裡面。 所有的元素都可以有子元素。子元素都必須正確地巢狀到母元素中。
 
    
    
     .....
    

    

 
     必須將屬性值引起來
 
     在XML中,在屬性值周圍省略引號是的。 同HTML一樣,XML元素的名/值對中可以有屬性。在XML中,屬性值必須引起來。看看下面的兩個XML文件。 第一個是正確的,第二個是錯誤的:
 
    
    
     Tove
     Jani
     Reminder
     Don't forget me this weekend!
    

    
    
    
     Tove
     Jani
     Reminder
     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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章