利用XML文件存儲數據,可以實現真正的跨平台,給我們的數據實現不同平台的轉換帶來很大的便利。本文的例子向您展示了如何對XML文件進行數據添加、刪除、修改的操作。為了敘述的方便,有時也把本例中的每個人的“個人資料”叫作記錄。
首先,我們列出XML文件的所有記錄,然後,用服務器端的ASP程序和XSL樣式單文件來把XML文件轉換到Html文件裡,以便顯示在任意浏覽器裡。
現在假定有一個客戶資料文件Userdata.XML如下:
<?XML version="1.0" encoding="gb2312"?>
<客戶資料表>
<個人資料>
<fIEld id="姓名" taborder="1">
<field_value>張三</fIEld_value>
</fIEld>
<fIEld id="性別" taborder="2">
<field_value>男性</fIEld_value>
</fIEld>
<fIEld id="地址" taborder="3">
<field_value>北京市第999號信箱</fIEld_value>
</fIEld>
<fIEld id="郵政編碼" taborder="4">
<field_value>100000</fIEld_value>
</fIEld>
<fIEld id="電話" taborder="5">
<field_value>86-10-88886666</fIEld_value>
</fIEld>
<fIEld id="電子郵件" taborder="6">
<field_value>zhangsan@examdomain.com</fIEld_value>
</fIEld>
</個人資料>
<個人資料>
<fIEld id="姓名" taborder="1">
<field_value>李四</fIEld_value>
</fIEld>
<fIEld id="性別" taborder="2">
<field_value>女性</fIEld_value>
</fIEld>
<fIEld id="地址" taborder="3">
<field_value>上海市黃浦區1208號黃浦大廈A座11層</fIEld_value>
</fIEld>
<fIEld id="郵政編碼" taborder="4">
<field_value>200200</fIEld_value>
</fIEld>
<fIEld id="電話" taborder="5">
<field_value>86-21-66668888</fIEld_value>
</fIEld>
<fIEld id="電子郵件" taborder="6">
<field_value>lisi@examdomain.com</fIEld_value>
</fIEld>
</個人資料>
<個人資料>
<fIEld id="姓名" taborder="1">
<field_value>楊過</fIEld_value>
</fIEld>
<fIEld id="性別" taborder="2">
<field_value>男性</fIEld_value>
</fIEld>
<fIEld id="地址" taborder="3">
<field_value>神雕俠侶桃花島</fIEld_value>
</fIEld>
<fIEld id="郵政編碼" taborder="4">
<field_value>888888</fIEld_value>
</fIEld>
<fIEld id="電話" taborder="5">
<field_value>800-810-8080</fIEld_value>
</fIEld>
<fIEld id="電子郵件" taborder="6">
<field_value>yangguo@examdomain.com</fIEld_value>
</fIEld>
</個人資料>
<個人資料>
<fIEld id="姓名" taborder="1">
<field_value>小龍女</fIEld_value>
</fIEld>
<fIEld id="性別" taborder="2">
<field_value>女</fIEld_value>
</fIEld>
<fIEld id="地址" taborder="3">
<field_value>神雕俠侶之古慕派</fIEld_value>
</fIEld>
<fIEld id="郵政編碼" taborder="4">
<field_value>999999</fIEld_value>
</fIEld>
<fIEld id="電話" taborder="5">
<field_value>800-810-9090</fIEld_value>
</fIEld>
<fIEld id="電子郵件" taborder="6">
<field_value>xiaolongnv@examdomain.com</fIEld_value>
</fIEld>
</個人資料>
</客戶資料表>
我們編寫Userdata.xsl樣式單文件如下:
<?XML version="1.0" encoding="gb2312" ?>
<xsl:stylesheet XMLns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<Html>
<head>
<META http-equiv="Content-Type" content="text/Html; charset=gb2312" />
</head>
<body bgcolor="#0099ff">
<h1>客戶資料?lt;/h1>
<table border="1" cellpadding="2">
<tr bgcolor="#ccccff">
<td align="center"><b>姓名</b></td>
<td align="center"><b>電子郵件</b></td>
</tr>
<xsl:for-each select="客戶資料表/個人資料">
<tr>
<td>
<a><xsl:attribute name="href">Userdata.ASP?mode=viewdetail&email=<xsl:value-of select="field[@id=''電子郵件'']/field_value"/></xsl:attribute><xsl:value-of select="field[@id=''姓名'']/fIEld_value"/></a>
</td>
<td><xsl:value-of select="field[@id=''電子郵件'']/fIEld_value"/></td>
</tr>
</xsl:for-each>
</table>
<br />
<a href="addnewdata.htm">增加新記錄</a>
</body>
</Html>
</xsl:template>
</xsl:stylesheet>
XSL樣式單文件遍歷整個XML文件的內容,並借助Html的table標記來顯示它。這裡允許浏覽者可以通過點擊客戶姓名來查看該客戶的詳細資料,也可以添加新的客戶信息。
下面,我們編寫Userdata.ASP程序來完成XML文件轉換,數據的浏覽、修改、刪除:
<%
''-------------------------------------------------------------------
''刪除記錄函數deleteDetail
''strXMLFile - 要載入的XML文件。
''strXSLFile - 顯示XML文件的XSL樣式單文件。
''strEMail - 要刪除客戶的電子郵件。
''-------------------------------------------------------------------
Function deleteDetail(strXMLFile, strXSLFile, strEMail)
Dim objDom
Dim objRoot
Dim objNode
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load strXMLFile
Set objRoot = objXML.documentElement
Set objNode = objRoot.SelectSingleNode("個人資料[field/fIEld_value=''" & strEMail & "'']")
objRoot.removeChild(objNode)
objXML.save strXMLFile
loadXMLFile strXMLFile,strXSLFile
End Function
''-------------------------------------------------------------------
''更新記錄函數updateDetail
''-------------------------------------------------------------------
Function updateDetail(strXMLFile, strXSLFile, strEMail)
''Declare local variables.
Dim objDom
Dim objRoot
Dim objContact
Dim objFIEld
Dim strNewEMail
strNewEMail = Request.Form("電子郵件")
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load strXMLFile
Set objRoot = objXML.documentElement
Set objContact = objRoot.SelectSingleNode("個人資料[field/fIEld_value=''" & strEMail & "'']")
For each objItem in Request.Form
Set objField = objContact.selectSingleNode("field[@id=''" & objItem & "'']/fIEld_value")
objFIEld.text = Request.Form(objItem)
Next
objXML.save strXMLFile
vIEwDetail strXMLFile, strXSLFile, strNewEMail
End Function
''-------------------------------------------------------------------
''顯示個人詳細資料函數vIEwDetail
''-------------------------------------------------------------------
Function vIEwDetail(strXMLFile, strXSLFile, strEMail)
Dim objXML
Dim objNode
Dim objXSL
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load(strXMLFile)
Set objNode = objXML.SelectSingleNode("客戶資料表/個人資料[field/fIEld_value=''" & strEMail & "'']")
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
objXSL.async = false
objXSL.load(strXSLFile)
Response.Write(objNode.transformNode(objXSL))
End Function
''-------------------------------------------------------------------
''顯示所有信息函數loadXMLFile
''-------------------------------------------------------------------
Function loadXMLFile(strXMLFile, strXSLFile)
Dim objXML
Dim objXSL
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load(strXMLFile)
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
objXSL.async = false
objXSL.load(strXSLFile)
Response.Write(objXML.transformNode(objXSL))
End Function
Dim strMode
Dim strEMail
strMode = Request.QueryString("mode")
strEMail = Request.QueryString("email")
Select Case strMode
Case "vIEwdetail"
vIEwDetail server.MapPath("Userdata.XML"), server.MapPath("vIEwdetail.xsl"), strEMail
Case "editdetail"
vIEwDetail server.MapPath("Userdata.XML"), server.MapPath("editdetail.xsl"), strEMail
Case "updatedetail"
updateDetail server.MapPath("Userdata.XML"), server.MapPath("vIEwdetail.xsl"), strEMail
Case "deletedetail"
deleteDetail server.MapPath("Userdata.XML"), server.MapPath("Userdata.xsl"), strEMail
Case Else
loadXMLFile server.MapPath("Userdata.XML"), server.MapPath("Userdata.xsl")
End Select
%>
我們可以利用下面的文件來完成新客戶信息的輸入,文件addnewdata.htm如下:
<Html><head><title>客戶信息輸入</title></head>
<body bgcolor="#0099ff">
<form action="processAdd.ASP" method="post">
<h3>請輸入您的客戶信息</h3>
姓 名: <input type="text" id="姓名" name="姓名"><br>
性 別: <input type="text" id=";性別" name="性別"><br>
地 址: <input type="text" id="地址" name="地址"><br>
郵政編碼: <input type="text" id="郵政編碼" name="郵政編碼"><br>
電 話: <input type="text" id="電話" name="電話"><br>
電子郵件: <input type="text" id="電子郵件" name="電子郵件"><br><br>
<input type="submit" id="btnSub" name="btnSub" value="填好了,發送"><br>
</form>
</body>
</Html>
當填寫完上面的表單後,提交到數據處理程序processAdd.asp,本程序可以判斷Userdata.xml文件是否存在,如果不存在,就建立新文件;否則把提交的數據添加到Userdata.XML中。然後根據提交成功與否,顯示數據保存成功與失敗。processAdd.ASP程序如下:
<%
''--------------------------------------------------------------------
''添加數據的函數addNewdatatoXML
''--------------------------------------------------------------------
Function addNewdatatoXML(strFileName)
Dim objDom
Dim objRoot
Dim objRecord
Dim objFIEld
Dim objFIEldValue
Dim objattID
Dim objattTabOrder
Dim objPI
Dim blnFileExists
Dim x
Set objDom = server.CreateObject("Microsoft.XMLDOM")
objDom.preserveWhiteSpace = True
blnFileExists = objDom.Load(strFileName)
If blnFileExists = True Then
Set objRoot = objDom.documentElement
Else
Set objRoot = objDom.createElement("客戶資料表")
objDom.appendChild objRoot
End If
Set objRecord = objDom.createElement("個人資料")
objRoot.appendChild objRecord
For x = 1 To Request.Form.Count
If instr(1,Request.Form.Key(x),"btn") = 0 Then
Set objField = objDom.createElement("fIEld")
Set objattID = objDom.createAttribute("id")
objattID.Text = Request.Form.Key(x)
objFIEld.setAttributeNode objattID
Set objattTabOrder = objDom.createAttribute("taborder")
objattTabOrder.Text = x
objFIEld.setAttributeNode objattTabOrder
Set objFieldValue = objDom.createElement("fIEld_value")
objFIEldValue.Text = Request.Form(x)
objRecord.appendChild objFIEld
objField.appendChild objFIEldValue
End If
Next
If blnFileExists = False then
Set objPI = objDom.createProcessingInstruction("XML", "version=''1.0'' encoding=''gb2312''")
objDom.insertBefore objPI, objDom.childNodes(0)
End If
objDom.save strFileName
Set objDom = Nothing
Set objRoot = Nothing
Set objRecord = Nothing
Set objFIEld = Nothing
Set objFIEldValue = Nothing
Set objattID = Nothing
Set objattTabOrder = Nothing
Set objPI = Nothing
End Function
On Error Resume Next
addNewdatatoXML server.MapPath("Userdata.XML")
If err.number <> 0 then
Response.write("<Html><body bgcolor=''#0099ff''><center><font color=red><b>您提交的表單沒有成功保存,請重新提交!!</b><br><br><a href=''Javascript:history.go(-1)''>點擊這裡重新進行提交。</a></body></Html>")
Else
Response.write("<html><body bgcolor=''#0099ff''><center><font color=red><b>您提交的表單已經成功保存!!!</b><br><br><a href=''Userdata.ASP''>點擊這裡查看添加後客戶資料?lt;/a></body></Html>")
End If
%>
至此,我們完成對XML文件進行數據添加、浏覽、修改、刪除的所有工作。當然,也可以根據需要,對所有記錄進行排序輸出,只需采用XSL:for-each元素的order-by屬性即可。以上所有程序在PWS+IE5.5和Netscape下調試通過。