读者可以通过此实例,了解在ASP(Active Server Page)中如何操纵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文件内容如下:
<?xml version="1.0" encoding="gb2312"?> <Persons> <Person> <Name>小东</Name> <Nick>gwd</Nick> <Mobile>139XXXXXXXX</Mobile> <Tel>XXXXXXXX</Tel> <Email>gwd@chinaren.com</Email> <QQ>7066015</QQ> <Company>XXX</Company> <Person> </Person> |
读者需要注意<?xml version="1.0" encoding="gb2312"?>这一行,XML默认不支持中文,通过设置encoding属性,才可以使XML正确地显示中文。读者可以在IE5.0及以上版本的浏览器中访问此文件,它会以 树型结构把数据显示出来。
三、格式转换XSL文件说明(Persons.xsl)例程中使用XSL对XMl数据进行格式化,并以HTML的形式返回到客户端。这个过程也可以放在客户端进行,但考虑到兼容性的问题,例程中采用了在服务器端通过ASP操纵DOM进行格式化的方法。
XSL文件的内容如下,
<?xml version="1.0" encoding="gb2312"?> function edit(intId) |
在服务器端的转换使用一个函数来完成,格式化成功,返回HTML字符串,格式化失败,打印出错误信息,如下,
'******************************************* strXmlFile = Server.MapPath(strXmlFile) Set objXml = Server.CreateObject("MSXML2.DOMDocument") objXML.Async = False Set objXsl = Nothing |
四、操作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的具体实现如下,
'*************************************************** Class Cls_Person Private m_intId ' Id,对应Person节点在Persons集合中的位置 ' 类初始化 ' 类释放 '-----读写各个属性--------------------------- Public Property Get Id Public Property Let Id(intId) Public Property Get Name Public Property Let Name(strName) Public Property Get Nick Public Property Let Nick(strNick) Public Property Get Mobile Public Property Let Mobile(strMobile) Public Property Get Tel Public Property Let Tel(strTel) Public Property Get Email Public Property Let Email(strEmail) Public Property Get QQ Public Property Let QQ(strQQ) Public Property Get Company Public Property Let Company(strCompany) '----------------------------------------------- ' 获取错误信息 ' 私有方法,添加错误信息 ' 清除错误信息 ' 从Xml中读取指定节点的数据,并填充各个属性 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then ' 选择并读取节点信息,赋予各个属性 ' 添加信息到XML文件中 ClearError If objXmlDoc Is Nothing Then ' 创建Person节点 ' 创建各个子节点 Set objNode = objXmlDoc.createElement("Nick") Set objNode = objXmlDoc.createElement("Mobile") Set objNode = objXmlDoc.createElement("Tel") Set objNode = objXmlDoc.createElement("Email") Set objNode = objXmlDoc.createElement("QQ") Set objNode = objXmlDoc.createElement("Company") Set objNode = Nothing On Error Resume Next ' 从XML文件中删除数据 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then Set objNodeList = objXmlDoc.getElementsByTagName("Person") On Error Resume Next If Err.Number = 0 Then ' 修改XML文件中的数据 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then Set objPersonList = objXmlDoc.getElementsByTagName("Person") Set objOldPerson = objPersonList(m_intId-1) ' 要修改的旧节点 Set objNewPerson = objXmlDoc.createElement("Person") ' 用来替换旧节点的新节点 Set objNode = objXmlDoc.createElement("Nick") Set objNode = objXmlDoc.createElement("Mobile") Set objNode = objXmlDoc.createElement("Tel") Set objNode = objXmlDoc.createElement("Email") Set objNode = objXmlDoc.createElement("QQ") Set objNode = objXmlDoc.createElement("Company") On Error Resume Next Set objOldPerson = Nothing If Err.Number = 0 Then End Class |
四、操作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的具体实现如下,
'*************************************************** Class Cls_Person Private m_intId ' Id,对应Person节点在Persons集合中的位置 ' 类初始化 ' 类释放 '-----读写各个属性--------------------------- Public Property Get Id Public Property Let Id(intId) Public Property Get Name Public Property Let Name(strName) Public Property Get Nick Public Property Let Nick(strNick) Public Property Get Mobile Public Property Let Mobile(strMobile) Public Property Get Tel Public Property Let Tel(strTel) Public Property Get Email Public Property Let Email(strEmail) Public Property Get QQ Public Property Let QQ(strQQ) Public Property Get Company Public Property Let Company(strCompany) '----------------------------------------------- ' 获取错误信息 ' 私有方法,添加错误信息 ' 清除错误信息 ' 从Xml中读取指定节点的数据,并填充各个属性 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then ' 选择并读取节点信息,赋予各个属性 ' 添加信息到XML文件中 ClearError If objXmlDoc Is Nothing Then ' 创建Person节点 ' 创建各个子节点 Set objNode = objXmlDoc.createElement("Nick") Set objNode = objXmlDoc.createElement("Mobile") Set objNode = objXmlDoc.createElement("Tel") Set objNode = objXmlDoc.createElement("Email") Set objNode = objXmlDoc.createElement("QQ") Set objNode = objXmlDoc.createElement("Company") Set objNode = Nothing On Error Resume Next ' 从XML文件中删除数据 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then Set objNodeList = objXmlDoc.getElementsByTagName("Person") On Error Resume Next If Err.Number = 0 Then ' 修改XML文件中的数据 ClearError If objXmlDoc Is Nothing Then If CStr(m_intId) = "-1" Then Set objPersonList = objXmlDoc.getElementsByTagName("Person") Set objOldPerson = objPersonList(m_intId-1) ' 要修改的旧节点 Set objNewPerson = objXmlDoc.createElement("Person") ' 用来替换旧节点的新节点 Set objNode = objXmlDoc.createElement("Nick") Set objNode = objXmlDoc.createElement("Mobile") Set objNode = objXmlDoc.createElement("Tel") Set objNode = objXmlDoc.createElement("Email") Set objNode = objXmlDoc.createElement("QQ") Set objNode = objXmlDoc.createElement("Company") On Error Resume Next Set objOldPerson = Nothing If Err.Number = 0 Then End Class |