欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

实例演练ASP+XML编程比较全的了第1/2页

程序员文章站 2023-08-13 21:03:01
本文是一篇实例讲解的文章。作为一个普通的程序员,我深知,一个优秀的例程,对于正在学习编程的人是多么的有帮助。本文中使用的例程 ,是一个联系信息管理程序,我也是写来以方便自己...
本文是一篇实例讲解的文章。作为一个普通的程序员,我深知,一个优秀的例程,对于正在学习编程的人是多么的有帮助。本文中使用的例程
,是一个联系信息管理程序,我也是写来以方便自己和朋友们互相联系用的。但麻雀虽小,五脏俱全,相信对正在学习asp+xml编程的朋友们
,还是具备一定的参考价值的。

读者可以通过此实例,了解在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"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> 
<xsl:template match="/persons"> 
<script language="javascript"> 
 function add() 
 { 
  window.open("add.asp", "add", "width=300,height=320,resize=no"); 
 } 

 function edit(intid) 
 { 
  window.open("edit.asp?id="+intid, "edit", "width=300,height=320,resize=no"); 
 } 
</script> 
<table width="600" border="0" align="center"> 
 <tr> 
  <td align="right"><a href="javascript:add();" title="添加新联系人">添加新联系人</a>  </td> 
 </tr> 
</table> 

<table align="center" width="680" cellspacing="1" cellpadding="2" border="0" bgcolor="#666600"> 
 <tr class="title" bgcolor="#e5e5e5"> 
  <td width="25"><xsl:text disable-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-each select="person"> 
 <tr bgcolor="#ffffff"> 
  <td align="right"><xsl:value-of select="position()"/></td> 
  <td style="color:#990000"><a><xsl:attribute name="href">javascript:edit('<xsl:value-of select="position 
()"/>');</xsl:attribute><xsl:attribute name="title">修改信息  </xsl:attribute><xsl:value-of select="name"/></a></td> 
  <td><xsl:value-of select="nick"/></td> 
  <td><xsl:value-of select="mobile"/></td> 
  <td><xsl:value-of select="tel"/></td> 
  <td><a><xsl:attribute name="href">mailto:<xsl:value-of select="email"/></xsl:attribute><xsl:value-of  
select="email"/></a></td> 
  <td><xsl:value-of select="qq"/></td> 
  <td><xsl:value-of select="company"/></td> 
 </tr>  
 </xsl:for-each> 
</table> 
</xsl:template>  
</xsl:stylesheet> 

在服务器端的转换使用一个函数来完成,格式化成功,返回html字符串,格式化失败,打印出错误信息,如下, 


复制代码 代码如下:
'******************************************* 
' 说明:使用xsl文件格式化xml文件。 
' 作者:gwd 2002-11-05 
' 参数:strxmlfile -- xml文件,路径+文件名 
' strxslfile -- xsl文件,路径+文件名 
' 返回:成功 -- 格式化后的html字符串 
' 失败 -- 自定义的错误信息 
'******************************************* 
function formatxml(strxmlfile, strxslfile) 
 dim objxml, objxsl 

 strxmlfile = server.mappath(strxmlfile) 
 strxslfile = server.mappath(strxslfile) 

 set objxml = server.createobject("msxml2.domdocument") 
 set objxsl = server.createobject("msxml2.domdocument") 

 objxml.async = false 
 if objxml.load(strxmlfile) then 
  objxsl.async = false 
  objxsl.validateonparse = false 
  if objxsl.load(strxslfile) then 
   on error resume next ' 捕获transformnode方法的错误 
   formatxml = objxml.transformnode(objxsl) 
   if objxsl.parseerror.errorcode <> 0 then 
    response.write "<br><hr>" 
    response.write "error code: " & objxsl.parseerror.errorcode 
    response.write "<br>error reason: " & objxsl.parseerror.reason 
    response.write "<br>error line: " & objxsl.parseerror.line 
    formatxml = "<span class=""alert"">格式化xml文件错误!</span>" 
   end if 
  else 
   response.write "<br><hr>" 
   response.write "error code: " & objxsl.parseerror.errorcode 
   response.write "<br>error reason: " & objxsl.parseerror.reason 
   response.write "<br>error line: " & objxsl.parseerror.line 
   formatxml = "<span class=""alert"">装载xsl文件错误!</span>" 
  end if  
 else 
  response.write "<br><hr>" 
  response.write "error code: " & objxml.parseerror.errorcode 
  response.write "<br>error reason: " & objxml.parseerror.reason 
  response.write "<br>error line: " & objxml.parseerror.line 
  formatxml = "<span class=""alert"">装载xml文件错误!</span>" 
 end if 

 set objxsl = nothing 
 set objxml = nothing 
end function
 
  四、操作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类 
' 作者:gwd 2002-11-06 
' 引用:pub/constpub.asp 
'*************************************************** 

class cls_person 

private m_intid ' id,对应person节点在persons集合中的位置 
private m_strname ' 姓名 
private m_strnick ' 英文名 
private m_strmobile ' 手机 
private m_strtel ' 电话 
private m_stremail ' 电子邮件 
private m_strqq ' qq号 
private m_strcompany ' 所在公司 
private m_strerror ' 出错信息 

' 类初始化 
private sub class_initialize() 
 m_strerror = "" 
 m_intid = -1 
end sub 

' 类释放 
private sub class_terminate() 
 m_strerror = "" 
end sub 

'-----读写各个属性--------------------------- 

public property get id 
 id = m_intid 
end property 

public property let id(intid) 
 m_intid = intid 
end property 

public property get name 
name = m_strname 
end property 

public property let name(strname) 
 m_strname = strname 
end property 

public property get nick 
 nick = m_strnick 
end property 

public property let nick(strnick) 
 m_strnick = strnick 
end property 

public property get mobile 
 mobile = m_strmobile 
end property 

public property let mobile(strmobile) 
 m_strmobile = strmobile 
end property 

public property get tel 
 tel = m_strtel 
end property 

public property let tel(strtel) 
 m_strtel = strtel 
end property 

public property get email 
 email = m_stremail 
end property 

public property let email(stremail) 
 m_stremail = stremail 
end property 

public property get qq 
 qq = m_strqq 
end property 

public property let qq(strqq) 
 m_strqq = strqq 
end property 

public property get company 
 company = m_strcompany 
end property 

public property let company(strcompany) 
 m_strcompany = strcompany 
end property 

'----------------------------------------------- 

' 获取错误信息 
public function getlasterror() 
 getlasterror = m_strerror 
end function 

' 私有方法,添加错误信息 
private sub adderr(strecho) 
 m_strerror = m_strerror + "<div class=""alert"">" & strecho & "</div>" 
end sub 

' 清除错误信息 
public function clearerror() 
 m_strerror = "" 
end function 

' 从xml中读取指定节点的数据,并填充各个属性 
' 需要首先设置id 
public function getinfofromxml(objxmldoc) 
 dim objnodelist 
 dim i 

 clearerror 

 if objxmldoc is nothing then 
  getinfofromxml = false 
  adderr "dom对象为空值" 
  exit function 
 end if 

 if cstr(m_intid) = "-1" then 
  getinfofromxml = false 
  adderr "未正确设置联系人对象的id属性" 
  exit function 
 else 
  i = m_intid - 1 ' 要读取得节点位置 
 end if 

 ' 选择并读取节点信息,赋予各个属性 
 set objnodelist = objxmldoc.getelementsbytagname("person") 
 if objnodelist.length - m_intid >= 0 then 
  on error resume next 
  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 "获取联系信息发生错误" 
  set objnodelist = nothing 
  exit function 
 end if 
 set objnodelist = nothing 
end function 

' 添加信息到xml文件中 
' 需要首先设置好要填充的属性 
public function addtoxml(objxmldoc) 
 dim objperson, objnode 

 clearerror 

 if objxmldoc is nothing then 
  addtoxml = false 
  adderr "dom对象为空值" 
  exit function 
 end if 

 ' 创建person节点 
 set objperson = objxmldoc.createelement("person") 
 objxmldoc.documentelement.appendchild objperson 

 ' 创建各个子节点 
 '----------------------------------------------------- 
 set objnode = objxmldoc.createelement("name") 
 objnode.text = m_strname 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("nick") 
 objnode.text = m_strnick 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("mobile") 
 objnode.text = m_strmobile 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("tel") 
 objnode.text = m_strtel 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("email") 
 objnode.text = m_stremail 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("qq") 
 objnode.text = m_strqq 
 objperson.appendchild objnode 

 set objnode = objxmldoc.createelement("company") 
 objnode.text = m_strcompany 
 objperson.appendchild objnode 
 '----------------------------------------------------- 

 set objnode = nothing 
 set objperson = nothing 

  on error resume next 
 objxmldoc.save server.mappath(c_xmlfile) '保存xml文件 
 if err.number = 0 then 
  addtoxml = true 
 else 
  addtoxml = false 
  adderr err.description 
 end if 
end function 

' 从xml文件中删除数据 
' 需要首先设置id 
public function deletefromxml(objxmldoc) 
 dim objnodelist, objnode 

 clearerror 

 if objxmldoc is nothing then 
  deletefromxml = false 
  adderr "dom对象为空值" 
  exit function 
 end if 

 if cstr(m_intid) = "-1" then 
  deletefromxml = false 
  adderr "未正确设置联系人对象的id属性" 
  exit function 
 end if 

 set objnodelist = objxmldoc.getelementsbytagname("person")  
 if objnodelist.length - m_intid < 0 then 
  deletefromxml = false 
  adderr "未找到相应的联系人" 
  set objnodelist = nothing 
  exit function 
 end if 

 on error resume next 
 set objnode = objxmldoc.documentelement.removechild(objnodelist(intid-1)) 
 if objnode is nothing then 
  deletefromxml = false 
  adderr "删除联系人失败" 
  set objnodelist = nothing 
  exit function 
 else 
  objxmldoc.save server.mappath(c_xmlfile) 
 end if 
 set objnode = nothing 
 set objnodelist = nothing 

 if err.number = 0 then 
  deletefromxml = true 
 else 
  deletefromxml = false 
  adderr err.description 
 end if 
end function 

' 修改xml文件中的数据 
' 需要首先设置好id 
public function edittoxml(objxmldoc) 
 dim objpersonlist, objoldperson, objnewperson, objnode 

 clearerror 

 if objxmldoc is nothing then 
  edittoxml = false 
  adderr "dom对象为空值" 
  exit function 
 end if 

 if cstr(m_intid) = "-1" then 
  edittoxml = false 
  adderr "未正确设置联系人对象的id属性" 
  exit function 
 end if 

 set objpersonlist = objxmldoc.getelementsbytagname("person")  
 if objpersonlist.length - m_intid < 0 then 
  deletefromxml = false 
  adderr "未找到相应的联系人" 
  set objpersonlist = nothing 
  exit function 
 end if 

 set objoldperson = objpersonlist(m_intid-1) ' 要修改的旧节点 

 set objnewperson = objxmldoc.createelement("person") ' 用来替换旧节点的新节点 
 set objnode = objxmldoc.createelement("name") 
 objnode.text = m_strname 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("nick") 
 objnode.text = m_strnick 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("mobile") 
 objnode.text = m_strmobile 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("tel") 
 objnode.text = m_strtel 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("email") 
 objnode.text = m_stremail 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("qq") 
 objnode.text = m_strqq 
 objnewperson.appendchild objnode 

 set objnode = objxmldoc.createelement("company") 
 objnode.text = m_strcompany 
 objnewperson.appendchild objnode 

 on error resume next 
 ' 进行替换 
 set objnode = objxmldoc.documentelement.replacechild(objnewperson, objoldperson) 
 if objnode is nothing then 
 edittoxml = false 
 adderr "修改联系人失败" 
 set objoldperosn = nothing 
 set objnewperson = nothing 
 set objpersonlist = nothing 
 exit function 
else 
 objxmldoc.save server.mappath(c_xmlfile) 
end if 

set objoldperson = nothing 
set objnewperson = nothing 
set objpersonlist = nothing 

if err.number = 0 then 
 edittoxml = true 
else 
 edittoxml = false 
 adderr err.description 
end if 
end function 

end class
 
1