在线用户    站点地图 技术论坛 文档中心 站点导航 资源下载 语言参考 教程专题 站点统计 业务项目 使用帮助
您的位置
MSDN参考新加了CSS2参考,全中文,制作精良。245k下载。           新加了sxf_sxf推荐的"动态网页专家指导" 下载!          新加了lsg2002lsg推荐的"ASP.NET高级编程(PDF)" 下载!          新加了DHTML代码预览!!,功能强大哦!欢迎试用          新加了网友lincong为大家提供的SQL Server 2000 程序员指南,有点大,但同时也就说明内容全咯!           新加了网友ibra为大家提供的北大的JAVA课件,很适合初学者入门           新加了一个java的连接缓冲池代码示例           新加了人月神话电子版下载!软件工程巨著哦~~           更新了评分标准,引入了“专家分”概念,相信可以更好的激励大家的学习!详情请看“使用帮助”           新加了由网友GGG提供的“IIS超级管理手册”,值得一看哦!(虽然我没看过 :P )           新加了“英雄榜”,欢迎测试!           “无组件上传·从原理剖析到实践”已经全部完成,源码全部开放,有兴趣的朋友请到文档中心一探究竟。  您的位置  首页>文档中心>ASP>文档A0000011 在同一窗口中打开页面中的链接 在新窗口中打开页面中的链接 将ASPCHINA设为首页 将ASPCHINA加入书签    
 LOGIN HERE
用户:
密码: 忘记密码
记住密码 用户注册 游客进入
相关文章

MSXML 4.0 SDK 下载

利用asp+xml数据岛给静态内容增加评论功能

XML学习成长日记(七)2004.6.13

XML学习成长日记(六)2004.5.27

XML学习成长日记(五)2004.5.20

XML学习成长日记(四)2004.5.14

Flash + XML 制作二级菜单,实用教程。

XML轻松学习成长日记(三)

XML 编程简介

XML经典问答
发表文章
第三种途径-----基于XML的ASP留言板

作者:10号程序员     提交人:10号程序员     发布时间:02-11-18     文章类型:原创     浏览量:4248
参考链结:http://www.18asp.com/fso/0724/guest.asp    
关键字:XML
[本文档没有附件]
字体:    视力保护色: 杏仁黄  秋叶褐  胭脂红  芥末绿  天蓝  雪青  灰  银河白(默认色) [A0000011]

坦白地说,对于ASP我一直都不怎么感兴趣。如果要我写这种服务器端程序的话,
我会选择JSP。所以,本人一直都想在网上弄个便宜点的JSP空间;可是正如miles
前辈所说,连贵一点的都没有,更不用说便宜的了。没办法,只好用ASP了,
对于用ASP写留言板的主要途径,只要是地球人就都知道,用得最多的无外乎就
是文件组件与数据库组件;而大多提供ASP的服务商基于安全都禁用了文件组件,
也有的禁用了数据库组件。当然,就算用不了这两个组件,也并不代表我们就不
能用脚本来创建文件和修改文件了,我们还有第三种途径:MSXML组件。

以下是我用MSXML组件写的一个留言本程序,主要文件有guest.xml、guest.asp、
include.asp、certain.asp,另加一些图像文件,分别为1.jpg,2.jpg,……图像
文件放在pic目录下。这个脚本在ASP的各版本中均已测试通过,以下是所有的源
代码与讲解,肯请指正。

----------------------------------------------------------------------
◆1◆ guest.xml    该文件用来保存留言的数据文件,相当于数据库。
----------------------------------------------------------------------
<?xml version="1.0" encoding="gb2312"?>
<殷亮的留言本>
  <留言>
    <昵称>殷亮</昵称>
    <头像>pic/20.jpg</头像>
    <来自>湖北荆门</来自>
    <时间>2002-10-17 22:48:01</时间>
    <信箱>ask10@msn.com</信箱>
    <内容>这是一个基于XML的留言本</内容>
  </留言>
  <留言>
    <昵称>黄娟</昵称>
    <头像>pic/7.jpg</头像>
    <来自>湖北武汉</来自>
    <时间>2002-10-17 22:48:01</时间>
    <信箱>fengzhongluwei@hotmail.com</信箱>
    <内容>你好吗?</内容>
  </留言>
</殷亮的留言本>
-------------------------------------------------------------------------
上面的XML文件记录了两条留言,可以用任何文本编辑工具编辑,如果没有语法错误,
在浏览器中输入该文件名即可显示XML所独有的树状页面。因为是文本形式的,所以
从创建到修改都比专门的数据库要方便。而XML文档的规则与格式也非常自由,如果
你要创建一个新的XML文件,只需一字不改地照写第一行“<?xml version="1.0"
encoding="gb2312"?>”,而后面的标签与标签之间的text就可以很随意,仅仅遵守
以下规则即可:

1.首标签与尾标签必须对应,可以重复,但不可以嵌套。
2.标签的命名规则与JAVA/C/C++等程序语言的变量命名规则相似,区分大小写。
3.一个文档只能有一个根元素,如实例中的“<殷亮的留言本>”
4.唯一的关键字“XML”,标签不能以这三个字母开头。

如果文档与规则有所冲突,将导制XML文档在浏览器中无法正常显示,且当ASP脚本调
用该文档时也会出现错误,所以强烈建议将写好的XML文件先在浏览器中预览,没有
发现错误时,再开始编写ASP脚本。

下面是关于ASP中读写XML文件的相关语句:(以上面的XML文件为例)

应用组件,读入文件:
set guestXml = Server.CreateObject("MSXML.DOMDocument")
guestXml.load Server.MapPath("guest.xml")

显示第一条留言中的“殷亮”
<%=guestXml.documentelement.childNodes.item(0).childNodes.item(0).text%>
可以解释为:XML对象.XML根标签.子标签集合.第一条.子标签集合.第一条.文本
这样,通过一级一级的访问,最终定位到了第三级标签上。
当然,我们也可以先用 set root = guestXml.documentelement.childNodes
这样,当我们要显示“殷亮”的时候,就可以用:
<%=root.item(0).childNodes.item(0).text%>

显示第二条留言中的“湖北武汉”
<%=guestXml.documentelement.childNodes.item(1).childNodes.item(2).text%>
和数组类似,XML的下标也是由0开始。

显示一个标签中所有子标签的个数,如显示留言总数:
<%=guestXml.documentelement.childNodes.length%>

显示第一条留言中的项目数:
<%=guestXml.documentelement.childNodes.item(0).childNodes.length%>

对文件修改后,保存XML文件,使修改生效:
<%guestXml.save%>

在第一条留言中添加一个子标签“<主题>a test</主题>”
<%
set titleTag = guestXml.createelement("主题")  ''''先创建一个标签
titleTag.text= "a test"      '''''设定标签中的文本
guestXml.documentelement.childNodes.item(1).appendchild titleTag
                              '''''添加到指定的标签下
guestXml.save
%>
当你再次打开guest.xml文件时,你会发现添加已经成功。

MSXML对象的相关语法不止这些,但有了这几个关键的,已经足够我们写留言本了。

--------------------------------------------------------------------------
◆2◆ guest.asp    该文件为留言本的主页面,包括显示留言的总数与总页数
--------------------------------------------------------------------------
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%  '使浏览器每次都从服务器载入网页
  Response.Expires = -1
  Response.AddHeader "Pragma","no-cache"
  Response.AddHeader "cache-control","no-store"
%>
<html>
  <head>
    <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <style type="text/css">
      <!--
  A:link    {text-decoration:none;color:#000000}
  A:active  {TEXT-DECORATION:none;color:#CC33FF}
  A:visited {TEXT-DECORATION:none;color:#000000}
  A:hover  {TEXT-DECORATION:underline overline;color:#CCCCFF}
  p, br, body, td, select, input, form, textarea, option{ font-family: 宋体; font-size: 9pt }
  .input1 {  font-size: 9pt; height: 18px; border: 1px #000000 solid; background-color: #CCCCFF}
    .input2 {  font-size: 9pt; height: 16px; border: 1px #000000 solid; background-color: #CCCCFF}
--></style>
    <title>【殷亮的留言本】谨以此留言板献给WISHES</title>
  </head>
  <body bgcolor="#cc33ff">
    <center>
      <table border="1" cellpadding="0" cellspacing="0" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" width="750" id="AutoNumber3" height="45">
        <tr>
          <td width="100%" bgcolor="#9933ff" align="middle" height="21" colspan="2" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&nbsp;【
            殷 亮 的 留 言 本 】</td>
        </tr>
          <%  '''''打开数据文件test.xml
            set guestXml = Server.CreateObject("MSXML.DOMDocument")
            guestXml.load Server.MapPath("guest.xml")
            set root = guestXml.documentelement.childNodes

            num = root.length          '''''获得留言总数
          %>
        <tr>
          <td width="77%" bgcolor="#9933ff" align="left" height="21" style="FONT-SIZE: 9pt;               FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;
          <%
            for i=1 to (num-1)\5+1          '''''因为是每5条留言为1页,所以总页数就是(num-1)\5+1
            Response.Write("<a href=include.asp?page="& i &" target=include>")
            Response.Write(" 第 "&i&" 页 |")  '''''通过此循环便制定了一个页间的导航。
            Response.Write("</a>")      '''''相当于HTML代码 <a href=include.asp?page=1 target=include>第1页</a>
            next
          %>
          </td>
          <td width="23%" bgcolor="#9933ff" align="middle" height="21" style="FONT-SIZE: 9pt;               FONT-FAMILY: 宋体">&nbsp;<A href="piclist.html" target="_blank">头像列表</A>
            | <label id=lab1 onclick="window.scroll(0,70)">书写留言</label></td>
        </tr>
      </table>
      <p><iframe name="include" width="749" height="314" src="include.asp" style="BORDER-RIGHT: #000000 1px double; PADDING-RIGHT: 4px; BORDER-TOP: #000000 1px double; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: #000000 1px double; PADDING-TOP: 1px; BORDER-BOTTOM: #000000 1px double">
            浏览器不支持嵌入式框架,或被配置为不显示嵌入式框架。</iframe></p>
      <table border="1" cellpadding="0" cellspacing="0" bgcolor="#9933ff" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" width="750" id="AutoNumber4" height="1">
        <form method="POST" action="certain.asp">
          <tr>
            <td width="21" height="1" align="left" style="VERTICAL-ALIGN: middle; LINE-HEIGHT: 150%; LETTER-SPACING: 3pt" rowspan="3">留言赠语</td>
            <td width="96" height="25" align="middle">您的名字:</td>
            <td width="171" height="25" align="middle">
              <INPUT size="20" name="textname" class="input1">
            </td>
            <td width="88" height="25" align="middle">您在何方:</td>
            <td width="194" height="25" align="middle">
              <INPUT size="20" name="textadd" class="input1">
            </td>
            <td width="173" height="25" align="middle" colspan="2">
              <INPUT size="20" name="textmail" value="yourmail@" class="input1">
            </td>
          </tr>
          <tr>
            <td width="552" height="1" colspan="4" rowspan="2"
                        align="center">
              <TEXTAREA style="border-style:double; border-width:3; WIDTH: 523px; HEIGHT: 37px; background-color:#CCCCFF; overflow:hidden" cols="72" rows="1" name="textmsg" class="input1">
              </TEXTAREA></td>
            <td width="10" height="1" rowspan="2" align="center"><img border="0" src="pic/1.jpg" width="40" height="56" id=idface>
            </td>
            <td width="159" height="1" align="center">&nbsp;<SELECT name="list" class="input1" style="WIDTH: 61;height:61" onchange="document.images['idface'].src=options[selectedIndex].value;">
                <option value=pic/1.jpg selected>头像1
                <script language=vbscript>
                  for i=2 to 15      '''''循环,用以设定下拉列表中的另外14个文件
                  document.write("<option value=pic/"&i&".jpg>头像"&i)
                  next
                </script>
              </option>
              </SELECT>
              <INPUT style="WIDTH: 65px; HEIGHT: 19px" type="button" value="头像列表" class="input2">
            </td>
          </tr>
          <tr>
            <td width="159" height="1" align="center"><INPUT style="WIDTH: 65px; HEIGHT: 19px" type="reset" size="25" value="清空" class="input2">
              <INPUT style="WIDTH: 65px; HEIGHT: 19px" type="submit" value="提交" class="input2"></td>
          </tr>
        </form>
      </table>
    </center>

    <%  '''''在浏览器的状态栏中显示类似"当前共有8条留言,分2页显示,最近留言的人是陈树"
      status = "当前共有"& num &"条留言,分"& (num-1)\5+1 &"页显示,最近留言的人是"& guestXml.documentelement.lastchild.firstchild.text
      Response.Write("<script>")
      Response.Write("window.status="&chr(34)& status &chr(34))
      Response.Write("</script>")
    %>

  </body>
</html>

------------------------------------------------------------------------------
◆ 3 ◆ include.asp  该文件嵌入在主页面中,用来显示留言。
------------------------------------------------------------------------------

<% '使浏览器每次都从服务器载入内容
  Response.Expires = -1
  Response.AddHeader "Pragma","no-cache"
  Response.AddHeader "cache-control","no-store"
%>

<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>留言赠语</title>
<style>
<!--
p, br, body, td, select, input, form, textarea, option{ font-family: 宋体; font-size: 9pt }
table{border-style:double; border-width:3; padding:0; border-collapse: collapse}
.input1 {  font-size: 9pt; border: 1px #000000 solid; background-color: #CCCCFF}

-->
</style>
</head>

<body bgcolor="#CC33FF">
<center>

<%  '''''打开留言本数据文件
  set guestXml = Server.CreateObject("MSXML.DOMDocument")
  guestXml.load(Server.MapPath("guest.xml"))
  set root = guestXml.documentelement
  num = root.childNodes.length

  page=Request.QueryString("page")
  if page=Empty then          '''''如果没有参数传递,即http://…/include.asp时的情况。
    thispage = (num-1)\5+1  '''''每页显示5条留言,用thispage表示当前页码,无参数传递时显示最后一页。
    if num mod 5 = 0 then
      msgTotal = 5            '''''变量 msgTotal 表示当前页应该显示的留言数量
    else
      msgTotal = num mod 5
    end if
  else
    thispage = page          '''''类似于http://…/include.asp?page=1时的情况
    if StrComp(thispage,(num-1)\5+1,1)=0 then
      msgTotal = num mod 5
    else
        msgTotal = 5
    end if
  end if
  msgNum = (thisPage-1)*5+msgTotal    ''''msgNum表示当前页显示的留言是总条数的第N条
                    ''''因为是倒序显示,所以第一条留言应该是(thisPage-1)*5+msgTotal
%>

<%for i=1 to msgTotal%>
<%
  set xmlNode = root.childNodes.item(msgNum-1).childNodes  ''定位到要读取的留言
  name = xmlNode.item(0).text        '''''name变量表示留言人的姓名.
  pic = xmlNode.item(1).text        '''''pic变量表示头像的地址。
  add = xmlNode.item(2).text        '''''add变量表示留言人的地址。
  thistime = xmlNode.item(3).text    '''''this变量表示留言时间。
                    ''''不显示留言人的EMAIL。
  msg = xmlNode.item(5).text          ''''msg变量表示留言内容。
%>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#111111" width="100%" height="106" bgcolor="#FFFFFF">
  <tr>
    <td width="14%" rowspan="3" height="106" align="center">
    <img border="0"
    src=<%=pic%> width="100" height="143"></td>
    <td width="9%" height="10" align="center" bgcolor="#99CCFF">姓名</td>
    <td width="31%" height="10" align="center" bgcolor="#CCCCFF"><%=name%></td>
    <td width="10%" height="10" align="center" bgcolor="#99CCFF">来自</td>
    <td width="36%" height="10" align="center" bgcolor="#CCCCFF"><%=add%></td>
  </tr>
  <tr>
    <td width="86%" height="83" colspan="4" align="center"
    bgcolor="#9933FF"
    style="line-height: 150%; margin-left: 50; margin-right: 50">
  <TEXTAREA name="textmsg" class="input1" rows="6" cols="87" readonly><%=msg%></TEXTAREA></td>
  </tr>
  <tr>
    <td width="86%" height="11" colspan="4" align=right bgcolor="#CCCCFF">第<%=thispage%>页 | 第<%=msgTotal-i+1%>条 | <%=thistime%> |</td>
  </tr>
</table>
<br>
<%
msgNum = msgNum-1    ''''倒序显示,所以下一条留言的下标应是当前下标-1
next          ''''循环。
%>
</center>
</body>
</html>

-------------------------------------------------------------------------
◆ 4 ◆ certain.asp      该文件用于向XML文件中添加记录,并确认留言。
-------------------------------------------------------------------------
<html>

<head>
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html;

charset=gb2312">
<title>【殷亮的留言本】留言确认</title>
</head>
<script language=vbscript>
  sub btn1_onclick    '''''当按下"查看留言"时,将网页导至留言页面
    window.location="guest.asp"
  end sub

  sub btn2_onclick
    window.close
  end sub
</script>

<body>

<%  '定义一个函数,用于检取留言内容。
  function htmlencode(str)
    dim result
    dim l
    if isNULL(str) then
      htmlencode=""
      exit function
    end if
    l=len(str)
    result=""
  dim i
  for i = 1 to l
      select case mid(str,i,1)
            case "<"
                  result=result+"&lt"
            case ">"
                  result=result+"&gt"
            case else
                  result=result+mid(str,i,1)
        end select
      next
      htmlencode=result
    end function

  set guestXml = Server.CreateObject("MSXML.DOMDocument")
  guestXml.load(Server.MapPath("guest.xml"))
  set root = guestXml.documentelement

  name = Request.Form("textname")    '''''检取表单的各项提交。
  pic = Request.Form("list")
  add = Request.Form("textadd")
  email = Request.Form("textmail")
  thistime = now()
  msg = Request.Form("textmsg")

  set newTag = guestXml.createelement("留言")
  root.appendchild newTag

  set currentTag = root.lastChild

  set nameTag = guestXml.createelement("姓名")
  nameTag.text=htmlencode(name)
  currentTag.appendchild nameTag

  set picTag = guestXml.createelement("头像")
  picTag.text=pic
  currentTag.appendchild picTag

  set addTag = guestXml.createelement("来自")
  addTag.text=htmlencode(add)
  currentTag.appendchild addTag

  set timeTag = guestXml.createelement("时间")
  timeTag.text=thistime
  currentTag.appendchild timeTag

  set emailTag = guestXml.createelement("信箱")
  emailTag.text=htmlencode(email)
  currentTag.appendchild emailTag

  set msgTag = guestXml.createelement("内容")
  msgTag.text=htmlencode(msg)
  currentTag.appendchild msgTag

  guestXml.save(Server.MapPath("guest.xml"))
%>
<embed width="350" height="200" src="pic/certain.swf" style="position: absolute; left: 214; top: 86">'''''一个FLASH文件。
<input type="button" value="查看留言" name="btn1"
    style="position: absolute; left: 282; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F">
<input type="button" value="关闭此页" name="btn2"
    style="position: absolute; left: 414; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F">
</body>
</html>

---------------------------------------------------------------------------------
备注:

由于我们是用XML文件保存数据,所以在添加数据时的HTML过滤是很重要的。在基于数据库的
留言本中不小心留下一个HTML标签也许不会造成什么太大的问题,但在XML中,后果是严重的
随便的一个标记,甚至随便的一个"<"都可以让你的留言本瘫痪。
如“<姓名>约翰<列浓</姓名>”………………………

上面四个文件源代码都已经过测试,复制后便可使用。
如果你想看示例演示,可以点击后面的链接        示例

你也可以从http://0724.y365.com/guest.rar
下载所有脚本文件与图像文件的压缩包。

旨在探讨,如有错漏,欢迎指正与讨论。

感谢站长miles这些日子来不倦的帮助,无以回报,唯有灌上此文。

---------------------------Copyright 2002, 殷亮. All rights reserved--------------

关于这篇文章的评论 [注意:这里仅仅是给大家提供了一个发表对文章本身看法的地方,如果有疑问,请到论坛提出] 我要提问!
kinomelma        2002/12/13 15:18:00
如何刪除
褫眕崝樓岆羶渣ㄛ
筍岆蜆&#63537;睡刉壺儸ˋ
==============
可以增加是沒錯,
但是該如何刪除呢?
miles        2002/11/28 13:34:00
不错不错!值得好好学习!
XML也是一种数据的呈现形式,可以当作数据库的替代。实际上,XML已经是结构化数据的标准了。soap/webservice,包括更早的B2B的数据同步(DTD转化),都是基于xml的应用。
标题
内容
发言
*您尚未以注册用户身份登录,不能发表评论。这里登录
您的位置
  (c)2000-2021 Yup Studio, all rights reserved.  
158.2031