xml常规应用之asp读写文档
一个简单的新闻发布系统的说起:
首先,我们建立一个XML文档,命名为nnDB.xml:
---------------------------------------nnDB.xml---------------------------------------
<?xmlversion="1.0"encoding="GB2312"?>
<data><news></news></data>
---------------------------------------nnDB.xml---------------------------------------
接着,做一个发布的页面,这个发布页面连带了有新闻的显示列表,把他命名为post.asp吧!
---------------------------------------post.asp---------------------------------------
<style>
#news_list{width:430px;float:left;border:1pxsolid#CFCFCF;}
#tt{width:300px;float:left;border-top:2pxsolid#CFCFCF;}
#pt{width:129px;float:right;border-top:2pxsolid#CFCFCF;}
#ct{width:430px;float:left;border-top:1pxsolid#CFCFCF;}
#news_listlispan{font-size:12px;letter-spacing:1px;font-family:Tahoma;}
#c1{width:40px;float:left;padding:5px0px5px0px;background-color:#EFEFEF;font-weight:bold;color:#666;text-align:center;border:1pxsolid#FFF;}
#c2{float:left;padding:5px;font-size:12px;color:#333;text-align:center;letter-spacing:1px;border:1pxsolid#FFF;}
#c3{width:380px;float:right;margin:0px5px0px5px;padding:3px0px3px0px;text-align:right;color:#CCC;border-top:1pxdotted#CFCFCF;}
</style>
<%
SetXMLOBJ=Server.CreateObject("Microsoft.XMLDOM")
XMLOBJ.async=False
XMLOBJ.loadServer.MapPath("nnDB.xml")
Setnews_root=XMLOBJ.documentElement.selectSingleNode("news")
news_count=news_root.childNodes.length
HTML_CODE="<divid=""news_list"">"
fori=0tonews_count-1
Settemp_news=news_root.childNodes.item(i).childNodes
HTML_CODE=HTML_CODE&"<liid=""tt""><spanid=""c1"">标题</span><spanid=""c2"">"&temp_news.item(3).text&"</span></li><liid=""pt""><spanid=""c1"">作者</span><spanid=""c2"">"&temp_news.item(4).text&"</span></li>"
HTML_CODE=HTML_CODE&"<liid=""ct""><spanid=""c1"">内容</span><spanid=""c2"">"&temp_news.item(5).text&"</span><spanid=""c3"">发表时间:"&temp_news.item(2).text&"点击量:"&temp_news.item(6).text&"</span></li>"
next
HTML_CODE=HTML_CODE&"</div>"
Response.writeHTML_CODE
%>
<formid="form1"name="form1"method="post"action="save_DB.asp">
<p>新闻标题:<inputtype="text"name="tt"/></p>
<p>新闻作者:<inputtype="text"name="pt"/></p>
<p>新闻内容:<textareaname="ct"cols="50"rows="12"></textarea></p>
<p><inputtype="submit"name="Submit"value="提交"/><inputtype="reset"name="Submit2"value="重置"/></p>
</form>
---------------------------------------post.asp---------------------------------------
最后就是save_DB.asp,写入XML的页面:
---------------------------------------save_DB.asp---------------------------------------
<%
'tt作者pt发布人ct新闻内容
tt=trim(Request.Form("tt"))'trim去空格
pt=trim(Request.Form("pt"))
ct=trim(Request.Form("ct"))
time_now=now()
'抓时间,作为新闻条目的区别检索
D_y=year(time_now)
D_m=month(time_now)
D_d=day(time_now)
D_hr=hour(time_now)
D_mi=minute(time_now)
D_se=second(time_now)
'PS:为何要用日期时间做新闻区别呢?我们假设,这个发布后台,只有你一个人可以访问,那么可以肯定一样东西:同一时间内,只可能发布一篇文章。
'当然,网站平台是面向多用户,如何制作更科学合理的数据索引呢?嗯,大家有兴趣,我日后再单独分类讨论。暂时就用这个吧!
idx=D_y&D_m&D_d&D_hr&D_mi&D_se
'中间的检查和判断,我就此跳过,直接看写入XML文档。
iftt=""orpt=""orct=""then
msg="新闻标题、发布人和内容为必填项目。"
Response.Write"<script>alert("""&msg&"\n\n页面将自动返回..."");window.location='post.asp';</script>"
else
SourceFile=Server.MapPath("nnDB.xml")
SetobjXML=Server.CreateObject("Microsoft.XMLDOM")
objXML.load(SourceFile)
IfobjXML.parseError.ErrorCode<>0Then
objXML.loadXML"<?xmlversion=""1.0""encoding=""GB2312""?><data><news></news></data>"
EndIf
SetobjRootlist=objXML.documentElement.selectSingleNode("news")
IfobjRootlist.hasChildNodesthen
id=objRootlist.lastChild.firstChild.text+1
Else
id=1
EndIf
SetoListNode=objXML.documentElement.selectSingleNode("news").AppendChild(objXML.createElement("item"))
SetoDetailsNode=oListNode.appendChild(objXML.createElement("id"))
oDetailsNode.Text=id
SetoDetailsNode=oListNode.appendChild(objXML.createElement("index"))
oDetailsNode.Text=idx
SetoDetailsNode=oListNode.appendChild(objXML.createElement("time"))
oDetailsNode.Text=time_now
SetoDetailsNode=oListNode.appendChild(objXML.createElement("title"))
oDetailsNode.Text=tt
SetoDetailsNode=oListNode.appendChild(objXML.createElement("poster"))
oDetailsNode.Text=pt
SetoDetailsNode=oListNode.appendChild(objXML.createElement("content"))
oDetailsNode.Text=objXML.createCDATASection(ct).text
SetoDetailsNode=oListNode.appendChild(objXML.createElement("hit"))
oDetailsNode.Text=0
objXML.save(SourceFile)
SetobjXML=nothing
msg="新闻信息成功已写入。"
Response.Write"<script>alert("""&msg&"\n\n页面将自动返回..."");window.location='post.asp';</script>"
endif
%>
---------------------------------------save_DB.asp---------------------------------------
好,至此,三页文件,基本完成。一个小型发布系统基本成型了,在这个基础上,可以开发出很多东西,简单的如留言本等等。
简单的说明一下:
在post.asp页面内,style部分,就是制定新闻列表的CSS样式表,大家不需要把注意力放在上面。接着就是建立dom对象,然后读取文件。后半段,是一个输入表单。
今天的重点是:save_DB.asp。
首先是objXML.loadXML"<?xmlversion=""1.0""encoding=""GB2312""?><data><news></news></data>",这里是选择读取XML文档<data><news>开始到</news></data>结束,中间这部分的元素,应该很容易理解。
接着,我们再单独读取news标记下的所有元素,并返回第一个元素。.hasChildNodes方法是用来检查,选定的节点下是否存在子节点。是,则根据最后一个<item>节点内的第一个节点的值,+1,形成新新闻的表内索引号。否则,则表示这个节点内没有任何子节点,那么表内索引自然从1开始。这个做法是不是科学,我们暂且不做详细的讨论,和新闻数据的索引,作为日后讨论的重点(个人认为,这并不是最好的做法,有一些严重的漏洞。)。
然后,就到重头戏了。SetoListNode=objXML.documentElement.selectSingleNode("news").AppendChild(objXML.createElement("item")),这里实际包含了两步的操作,首先从根节点新创建一个节点,接着同时创建一个名为item的元素,成为该节点……为什么?呃……能不能不说啊……然后依次创建item节点下的子节点,及节点中的内容。最后写入XML文档,于此,已完成一个简单的写入。值得讨论的地方不多,不过下面贴一些DOM的对象和方法的简略说明,知道一下就可以了。
documentElement属性确认XML文件的根(Root)节点。
selectSingleNode传回第一个符合样式的节点。
loadXML方法加载一个XML文件或字符串的片断。
haschildnodes方法如果指定的节点有一个或更多子节点,传回值为true。
createElement方法建立一个指定名称的元素。
AppendChild方法加上一个节点当作指定节点最后的子节点。
createCDATASection方法建立一个包含特定数据的CDATA。