实例演练ASP+XML编程比较全的了第12页
2018-09-06 10:08
  本文是一篇实例讲解的文章。作为一个普通的程序员,我深知,一个优秀的例程,对于正在学习编程的人是多么的有帮助。本文中使用的例程 
,是一个联系信息管理程序,我也是写来以方便自己和朋友们互相联系用的。但麻雀虽小,五脏俱全,相信对正在学习ASP+XML编程的朋友们 
,还是具备一定的参考价值的。 
读者可以通过此实例,了解在ASP(ActiveServerPage)中如何操纵XML文件,并进行数据的各种处理,包括XML节点的建立、修改、删除 
和保存等等。文中涉及到的技术包括ASP,VBScript,DOM,XML和XSL等。 
本文未对使用到的技术进行深入的理论介绍,因此,读者需要具备一定的相关知识,尤其是对ASP、XML和DOM应该有一定的了解。通读本文 
,并参考源代码,相信读者一定可以熟练地掌握XML编程。 
一、程序说明 
例程基于B/S结构,使用XML文件存储联系信息,然后通过一个VBScript写的Class,使用DOM,对XML文件中的联系信息进行各种操作。 
例程提供的代码采用了统一的命名规范,主要包括:用三个字母的缩写说明变量类型,如数字类型——int,字符串类型——str,对象— 
—obj,等等,虽然在ASP/VBScript中,不区分数据类型,但使用明显的数据类型说明,对程序的编写和维护还是很有意义的;使用有意义的变 
量名称,如XMLDocument对象,定义为objXmlDoc,等等,同样,这样做的也是为了更好地编写和维护程序。 
此程序可以分为后台数据处理和前台界面表现两部分。 
程序后台,使用VBScript编写了一个Class,这是在VBScript5.0版中提供的新特性。虽然这里Class的概念和真正的面向对象相去甚远,但 
是,在ASP中合理地使用Class,还是可以在一定程度上提高程序的运行效率和可维护性。 
前台表现,使用XSL对XML文件中的数据进行了格式化,然后以HTML的形式输出到客户端,充分体现了XML技术带来的灵活性与可定制性。格 
式化的过程放在了服务器端,使用ASP程序完成,这样,客户端得到的是经过格式化之后的HTML信息,避免了兼容性问题的出现。 
当然,程序对于具体的操作细节未作非常严格的检验,比如联系信息必填项的检查,但是,对于在ASP中使用DOM操作XML的有关部分,程序 
提供了完整的示例代码。 
二、XML文件说明(persons.xml) 
例程中使用到的XML文件结构十分简单,并且没有定义相关的Schema或者DTD,因为,对于此程序这是不必要的。当然,如果读者愿意自己 
定义一个的话,也不会对程序的运行产生影响。 
程序的数据结构定义如下,Persons集合,它包含多个Person对象,每一个Person对象包括姓名Name、英文名Nick、手机Mobile、电话Tel 
、电子邮件Email、腾讯QQ和所在公司Company的属性。将以上定义对应到XML文件即,Persons为根节点,Person为Persons的子节点,Name、 
Nick、Mobile、Tel、Email、QQ和Company为Person的子节点。 
这样,我们得到的XML文件内容如下: 
复制代码 代码如下:<?xmlversion=1.0encoding=gb2312?> 
<Persons> 
<Person> 
<Name>小东</Name> 
<Nick>gwd</Nick> 
<Mobile>139XXXXXXXX</Mobile> 
<Tel>XXXXXXXX</Tel> 
lt;/Email> 
<QQ>7066015</QQ> 
<Company>XXX</Company> 
<Person> 
</Person> 
读者需要注意<?xmlversion=1.0encoding=gb2312?>这一行,XML默认不支持中文,通过设置encoding属性,才可以使XML正确地显示 
中文。读者可以在IE5.0及以上版本的浏览器中访问此文件,它会以树型结构把数据显示出来。 
三、格式转换XSL文件说明(Persons.xsl) 
例程中使用XSL对XMl数据进行格式化,并以HTML的形式返回到客户端。这个过程也可以放在客户端进行,但考虑到兼容性的问题,例程中 
采用了在服务器端通过ASP操纵DOM进行格式化的方法。 
XSL文件的内容如下, 
复制代码 代码如下:<?xmlversion=1.0encoding=gb2312?> 
<xsl:stylesheetxmlns:xsl=
<xsl:templatematch=/Persons> 
<scriptlanguage=javascript> 
functionadd() 
{ 
window.open(add.asp,add,width=300,height=320,resize=no); 
} 
functionedit(intId) 
{ 
window.open(edit.asp?id=+intId,edit,width=300,height=320,resize=no); 
} 
</script> 
<tablewidth=600border=0align=center> 
<tr> 
<tdalign=right><ahref=javascript:add();title=添加新联系人>添加新联系人</a></td> 
</tr> 
</table> 
<tablealign=centerwidth=680cellspacing=1cellpadding=2border=0bgcolor=#666600> 
<trclass=titlebgcolor=#E5E5E5> 
<tdwidth=25><xsl:textdisable-output-escaping=yes>&</xsl:text>nbsp;</td> 
<td>姓名</td> 
<td>英文名</td> 
<td>手机</td> 
<td>电话</td> 
<td>Email</td> 
<td>QQ</td> 
<td>所在公司</td> 
</tr> 
<xsl:for-eachselect=Person> 
<TRBGCOLOR=#FFFFFF> 
<TDALIGN=right><xsl:value-ofselect=position()/></TD> 
<TDSTYLE=color:#990000><A><xsl:attributename=HREF>javascript:edit(<xsl:value-ofselect=position 
()/>);</xsl:attribute><xsl:attributename=title>修改信息</xsl:attribute><xsl:value-ofselect=Name/></A></TD> 
<TD><xsl:value-ofselect=Nick/></TD> 
<TD><xsl:value-ofselect=Mobile/></TD> 
<TD><xsl:value-ofselect=Tel/></TD> 
<TD><A><xsl:attributename=HREF>mailto:<xsl:value-ofselect=Email/></xsl:attribute><xsl:value-of 
select=Email/></A></TD> 
<TD><xsl:value-ofselect=QQ/></TD> 
<TD><xsl:value-ofselect=Company/></TD> 
</TR> 
</xsl:for-each> 
</table> 
</xsl:template> 
</xsl:stylesheet>
在服务器端的转换使用一个函数来完成,格式化成功,返回HTML字符串,格式化失败,打印出错误信息,如下,
复制代码 代码如下:******************************************* 
说明:使用XSL文件格式化XML文件。 
作者:gwd2002-11-05 
参数:strXmlFile--Xml文件,路径+文件名 
strXslFile--Xsl文件,路径+文件名 
返回:成功--格式化后的HTML字符串 
失败--自定义的错误信息 
******************************************* 
FunctionFormatXml(strXmlFile,strXslFile) 
DimobjXml,objXsl 
strXmlFile=Server.MapPath(strXmlFile) 
strXslFile=Server.MapPath(strXslFile) 
SetobjXml=Server.CreateObject(MSXML2.DOMDocument) 
SetobjXsl=Server.CreateObject(MSXML2.DOMDocument) 
objXML.Async=False 
IfobjXml.Load(strXmlFile)Then 
objXsl.Async=False 
objXsl.ValidateonParse=False 
IfobjXsl.Load(strXslFile)Then 
OnErrorResumeNext捕获transformNode方法的错误 
FormatXml=objXml.transformNode(objXsl) 
IfobjXsl.parseError.errorCode<>0Then 
Response.Write<br><hr> 
Response.WriteErrorCode:&objXsl.parseError.errorCode 
Response.Write<br>ErrorReason:&objXsl.parseError.reason 
Response.Write<br>ErrorLine:&objXsl.parseError.line 
FormatXml=<spanclass=alert>格式化XML文件错误!</span> 
EndIf 
Else 
Response.Write<br><hr> 
Response.WriteErrorCode:&objXsl.parseError.errorCode 
Response.Write<br>ErrorReason:&objXsl.parseError.reason 
Response.Write<br>ErrorLine:&objXsl.parseError.line 
FormatXml=<spanclass=alert>装载XSL文件错误!</span> 
EndIf 
Else 
Response.Write<br><hr> 
Response.WriteErrorCode:&objXml.parseError.errorCode 
Response.Write<br>ErrorReason:&objXml.parseError.reason 
Response.Write<br>ErrorLine:&objXml.parseError.line 
FormatXml=<spanclass=alert>装载XML文件错误!</span> 
EndIf 
SetobjXsl=Nothing 
SetobjXml=Nothing 
EndFunction
四、操作Xml数据的Cls_Person类说明(clsPerson.asp) 
Cls_Person类用来完成与联系人信息相关的各种操作,包括添加、修改和删除等等,它使用VBScript编写。Cls_Person包括Id、Name、 
Nick、Mobile、Tel、Email、QQ和Company属性,对应于XML文件中的Person节点。Cls_Person包括GetInfoFromXml、AddToXml、EditToXml和 
DeleteFormXml四个主要方法,分别完成获取信息,添加信息,修改信息和删除信息四个功能。 
Cls_Person的具体实现如下,
复制代码 代码如下:*************************************************** 
说明:Person类 
作者:gwd2002-11-06 
引用:pub/constpub.asp 
*************************************************** 
ClassCls_Person 
Privatem_intIdId,对应Person节点在Persons集合中的位置 
Privatem_strName姓名 
Privatem_strNick英文名 
Privatem_strMobile手机 
Privatem_strTel电话 
Privatem_strEmail电子邮件 
Privatem_strQQQQ号 
Privatem_strCompany所在公司 
Privatem_strError出错信息 
类初始化 
PrivateSubClass_Initialize() 
m_strError= 
m_intId=-1 
EndSub 
类释放 
PrivateSubClass_Terminate() 
m_strError= 
EndSub 
-----读写各个属性--------------------------- 
PublicPropertyGetId 
Id=m_intId 
EndProperty 
PublicPropertyLetId(intId) 
m_intId=intId 
EndProperty 
PublicPropertyGetName 
Name=m_strName 
EndProperty 
PublicPropertyLetName(strName) 
m_strName=strName 
EndProperty 
PublicPropertyGetNick 
Nick=m_strNick 
EndProperty 
PublicPropertyLetNick(strNick) 
m_strNick=strNick 
EndProperty 
PublicPropertyGetMobile 
Mobile=m_strMobile 
EndProperty 
PublicPropertyLetMobile(strMobile) 
m_strMobile=strMobile 
EndProperty 
PublicPropertyGetTel 
Tel=m_strTel 
EndProperty 
PublicPropertyLetTel(strTel) 
m_strTel=strTel 
EndProperty 
PublicPropertyGetEmail 
Email=m_strEmail 
EndProperty 
PublicPropertyLetEmail(strEmail) 
m_strEmail=strEmail 
EndProperty 
PublicPropertyGetQQ 
QQ=m_strQQ 
EndProperty 
PublicPropertyLetQQ(strQQ) 
m_strQQ=strQQ 
EndProperty 
PublicPropertyGetCompany 
Company=m_strCompany 
EndProperty 
PublicPropertyLetCompany(strCompany) 
m_strCompany=strCompany 
EndProperty 
----------------------------------------------- 
获取错误信息 
PublicFunctionGetLastError() 
GetLastError=m_strError 
EndFunction 
私有方法,添加错误信息 
PrivateSubAddErr(strEcho) 
m_strError=m_strError+<DivCLASS=alert>&strEcho&</Div> 
EndSub 
清除错误信息 
PublicFunctionClearError() 
m_strError= 
EndFunction 
从Xml中读取指定节点的数据,并填充各个属性 
需要首先设置Id 
PublicFunctionGetInfoFromXml(objXmlDoc) 
DimobjNodeList 
DimI 
ClearError 
IfobjXmlDocIsNothingThen 
GetInfoFromXml=False 
AddErrDom对象为空值 
ExitFunction 
EndIf 
IfCStr(m_intId)=-1Then 
GetInfoFromXml=False 
AddErr未正确设置联系人对象的ID属性 
ExitFunction 
Else 
I=m_intId-1要读取得节点位置 
EndIf 
选择并读取节点信息,赋予各个属性 
SetobjNodeList=objXmlDoc.getElementsByTagName(Person) 
IfobjNodeList.length-m_intId>=0Then 
OnErrorResumeNext 
m_strName=objNodeList(I).selectSingleNode(Name).Text 
m_strNick=objNodeList(I).selectSingleNode(Nick).Text 
m_strMobile=objNodeList(I).selectSingleNode(Mobile).Text 
m_strTel=objNodeList(I).selectSingleNode(Tel).Text 
m_strEmail=objNodeList(I).selectSingleNode(Email).Text 
m_strQQ=objNodeList(I).selectSingleNode(QQ).Text 
m_strCompany=objNodeList(I).selectSingleNode(Company).Text 
GetInfoFromXml=True 
Else 
GetInfoFromXml=False 
AddErr获取联系信息发生错误 
SetobjNodeList=Nothing 
ExitFunction 
EndIf 
SetobjNodeList=Nothing 
EndFunction 
添加信息到XML文件中 
需要首先设置好要填充的属性 
PublicFunctionAddToXml(objXmlDoc) 
DimobjPerson,objNode 
ClearError 
IfobjXmlDocIsNothingThen 
AddToXml=False 
AddErrDom对象为空值 
ExitFunction 
EndIf 
创建Person节点 
SetobjPerson=objXmlDoc.createElement(Person) 
objXmlDoc.documentElement.appendChildobjPerson 
创建各个子节点 
----------------------------------------------------- 
SetobjNode=objXmlDoc.createElement(Name) 
objNode.Text=m_strName 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Nick) 
objNode.Text=m_strNick 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Mobile) 
objNode.Text=m_strMobile 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Tel) 
objNode.Text=m_strTel 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Email) 
objNode.Text=m_strEmail 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(QQ) 
objNode.Text=m_strQQ 
objPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Company) 
objNode.Text=m_strCompany 
objPerson.appendChildobjNode 
----------------------------------------------------- 
SetobjNode=Nothing 
SetobjPerson=Nothing 
OnErrorResumeNext 
objXmlDoc.saveServer.MapPath(C_XMLFILE)保存XML文件 
IfErr.Number=0Then 
AddToXml=True 
Else 
AddToXml=False 
AddErrErr.Description 
EndIf 
EndFunction 
从XML文件中删除数据 
需要首先设置Id 
PublicFunctionDeleteFromXml(objXmlDoc) 
DimobjNodeList,objNode 
ClearError 
IfobjXmlDocIsNothingThen 
DeleteFromXml=False 
AddErrDom对象为空值 
ExitFunction 
EndIf 
IfCStr(m_intId)=-1Then 
DeleteFromXml=False 
AddErr未正确设置联系人对象的ID属性 
ExitFunction 
EndIf 
SetobjNodeList=objXmlDoc.getElementsByTagName(Person) 
IfobjNodeList.length-m_intId<0Then 
DeleteFromXml=False 
AddErr未找到相应的联系人 
SetobjNodeList=Nothing 
ExitFunction 
EndIf 
OnErrorResumeNext 
SetobjNode=objXmlDoc.documentElement.removeChild(objNodeList(intId-1)) 
IfobjNodeIsNothingThen 
DeleteFromXml=False 
AddErr删除联系人失败 
SetobjNodeList=Nothing 
ExitFunction 
Else 
objXmlDoc.saveServer.MapPath(C_XMLFILE) 
EndIf 
SetobjNode=Nothing 
SetobjNodeList=Nothing 
IfErr.Number=0Then 
DeleteFromXml=True 
Else 
DeleteFromXml=False 
AddErrErr.Description 
EndIf 
EndFunction 
修改XML文件中的数据 
需要首先设置好Id 
PublicFunctionEditToXml(objXmlDoc) 
DimobjPersonList,objOldPerson,objNewPerson,objNode 
ClearError 
IfobjXmlDocIsNothingThen 
EditToXml=False 
AddErrDom对象为空值 
ExitFunction 
EndIf 
IfCStr(m_intId)=-1Then 
EditToXml=False 
AddErr未正确设置联系人对象的ID属性 
ExitFunction 
EndIf 
SetobjPersonList=objXmlDoc.getElementsByTagName(Person) 
IfobjPersonList.length-m_intId<0Then 
DeleteFromXml=False 
AddErr未找到相应的联系人 
SetobjPersonList=Nothing 
ExitFunction 
EndIf 
SetobjOldPerson=objPersonList(m_intId-1)要修改的旧节点 
SetobjNewPerson=objXmlDoc.createElement(Person)用来替换旧节点的新节点 
SetobjNode=objXmlDoc.createElement(Name) 
objNode.Text=m_strName 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Nick) 
objNode.Text=m_strNick 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Mobile) 
objNode.Text=m_strMobile 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Tel) 
objNode.Text=m_strTel 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Email) 
objNode.Text=m_strEmail 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(QQ) 
objNode.Text=m_strQQ 
objNewPerson.appendChildobjNode 
SetobjNode=objXmlDoc.createElement(Company) 
objNode.Text=m_strCompany 
objNewPerson.appendChildobjNode 
OnErrorResumeNext 
进行替换 
SetobjNode=objXmlDoc.documentElement.replaceChild(objNewPerson,objOldPerson) 
IfobjNodeIsNothingThen 
EditToXml=False 
AddErr修改联系人失败 
SetobjOldPerosn=Nothing 
SetobjNewPerson=Nothing 
SetobjPersonList=Nothing 
ExitFunction 
Else 
objXmlDoc.saveServer.MapPath(C_XMLFILE) 
EndIf 
SetobjOldPerson=Nothing 
SetobjNewPerson=Nothing 
SetobjPersonList=Nothing 
IfErr.Number=0Then 
EditToXml=True 
Else 
EditToXml=False 
AddErrErr.Description 
EndIf 
EndFunction 
EndClass
 12下一页阅读全文
文章标题:实例演练ASP+XML编程比较全的了第12页
文章链接:http://soscw.com/index.php/essay/8565.html