ASP操作XML文件创建,查询,修改等对xml操作的主要方法
003 创建,查询,修改等对xml操作的主要方法
以下是代码片段:
'创建DOM对象
set objDom=server.CreateObject("MicroSoft.XMLDom")
'取得xml数据
'方法1 取得xml文件的xml数据
objDom.load("c:test.xml")
'方法2 取得xml数据串的数据
objDom.loadxml("<people><man name="sd"/></people>")
'创建一个节点对象
Set Newnode=objDom.CreateElement("people")
'给这个节点赴值
Newnode.Text="人"
' 给这个节点添加属性
Set NewAttribute=objDom.CreateNode("attribute","name","")
NewAttribute.Text= "张三"
Newnode.SetAttributeNode NewAttribute
'给这个节点添加子节点
Set NewnodeChild=objDom.CreateElement("address")
Newnode.appendChild NewnodeChild
'保存这个节点对象
objDom.appendChild Newnode
objDom.save("c:test.xml")
'查找一个节点对象
set objtofind=objdom.documentElement.SelectSingleNode("//people/man")
'取出这个节点对象的 节点名,节点值,某个属性值,和全部的xml
nodename=objtofind.nodename
nodevalue=objtofind.text
objtofind.GetAttributeNode("name").Nodevalue '属性名为name的属性值
'取出一个属性节点对象
set objattrtofind=objdom.documentElement.SelectSingleNode("//people/man"). GetAttributeNode("name")
'取出这个节点的属性名,属性值
nodeattrname=objattrtofind.nodename
nodeattrvalue=objattrtofind.nodevalue
'删除一个节点对象
set objnode=objdom.documentElement.SelectSingleNode("//people/man") '要删除的节点
set objparentnode=objdom.documentElement.SelectSingleNode("//people") '要删除的节点的父节点
Webjx.Com
objparentnode.removeChild objnode
'取出一个节点的字节点集合
set objnodes=objdom.documentElement.SelectSingleNode("//people/man").ChildNodes
遍历这个集合
方法1
for each element in objnodes
response.write element.nodename 字节点名
response.write element.text 字节点值
next
方法2
domlength=objnodes.length
for i = 0 to domlength-1
response.write objnodes.childnodes(i).nodename 字节点名
response.write objnodes.childnodes(i).text 字节点值
next
'取出一个节点的属性集合
set objnodes=objdom.documentElement.SelectSingleNode("//people/man").GetAttributeNode("name").attributes
遍历这个集合
for each element in objnodes
response.write element.nodename 属性名
response.write element.nodevalue 属性值
next
<%
'----------------------------------------------------------------
'程序简介: 完成asp语言对XML文档中指定节点文本的增加、删除、修改、查看
'入口参数: 无
'出口参数: 无
'------------------------------------------------
'函数名字:ConnectXml()
'入口参数: filename 需要连接或打开的xml文件名
'出口参数: 无
'返回值 :ConnectXml=0,XMLMorntekDocument就是一个成功装载XML文档的对象了。
' ConnectXml<>0,则打印错误信息strError
'------------------------------------------------
dim XMLMorntekDocument
function ConnectXml(filename)
dim strSourceFile
strSourceFile = Server.MapPath(filename)
Set XMLMorntekDocument = Server.CreateObject("Microsoft.XMLDOM")
XMLMorntekDocument.async = false
XMLMorntekDocument.load(strSourceFile)
ConnectXml=XMLMorntekDocument.parseerror.errorcode
if XMLMorntekDocument.parseerror.errorcode<>0 then
strError="<h2>error"&XMLMorntekDocument.parseerror.errorcode&"</h2>"
strError=strError&XMLMorntekDocument.parseerror.reason&"<br>"
strError=strError&XMLMorntekDocument.parseerror.url&"<br>"
strError=strError&XMLMorntekDocument.parseerror.line&"<br>"
strError=strError&XMLMorntekDocument.parseerror.filepos&"<br>"
strError=strError&XMLMorntekDocument.parseerror.srcText&"<br>"
response.write strError
end if
end function
'------------------------------------------------
'函数名字:CloseXml()
'入口参数: 无
'出口参数: 无
'------------------------------------------------
function CloseXml(XMLMorntekDocument)
if IsObject(XMLMorntekDocument) then
set XMLMorntekDocument=nothing
end if
end function
'------------------------------------------------
'函数名字:SelectXmlNodeText(elementname)
'入口参数: elementname 元素的名字
'出口参数: 无
'------------------------------------------------
function SelectXmlNodeText(elementname)
elementname="//"&elementname
temp=XMLMorntekDocument.selectSingleNode(elementname).text
selectXmlNodeText= server.htmlencode(temp)
end function
'------------------------------------------------
'函数名字:InsertXmlNodeText(befelementname,elementname,elementtext)
'入口参数: elementname 插入的元素的名字
' befelementname在此元素的名字前面插入元素
' elementtext 插入的元素的文本
'出口参数: 无
'------------------------------------------------
function InsertXmlNodeText(befelementname,elementname,elementtext)
dim befelement,element
set befelement=XMLMorntekDocument.selectSingleNode("//"&befelementname)
set element= XMLMorntekDocument.createelement(elementname)
befelement.insertBefore element,befelement.firstchild
element.text=elementtext
end function
'------------------------------------------------
'函数名字:UpdateXmlNodeText(elementname,newelementtext)
'入口参数: elementname 元素的名字
' newelementtext元素的新文本
'出口参数: 无
'------------------------------------------------
function UpdateXmlNodeText(elementname,newelementtext)
dim element
set element=XMLMorntekDocument.selectSingleNode("//"&elementname)
element.text=newelementtext
end function
'------------------------------------------------
'函数名字:DeleteXmlNodeText(elementname)
'入口参数: elementname 元素的名字
'出口参数: 无
'------------------------------------------------
function DeleteXmlNodeText(elementname)
XMLMorntekDocument.selectSingleNode("//"&elementname).text =""
end function
%>
让我们一起来写一些自己的Function,来更方便和直观地读写XML。
乍一看,XML跟HTML的格式非常相似,的确,因为它们都是衍生自SGML,基本数据也都是由首标签,尾标签,注释标签和一些普通文本组成。但XML在语法上比HTML要求更严格,稍有不慎,你的XML便会犯上语法错误,导致无法读取其中数据。比如,在HTML中,我们把<a href="index.html">写成<a href=index.html>是完全没问题的,但XML中这样就绝对不行,XML要求标记的属性必须用单引号或双引号引起来。至于如何写一个合法的XML文件,我在前两篇中都有叙说,大家可以搜索出来看几眼,这里也就不多写,下面给出一个合法的XML文件的例子,也是接下来我们要用到的。
================================================================= songlist.xml
<?xml version="1.0" encoding="gb2312"?>
<!-- 注释:转贴请注明作者 -->
<歌曲列表>
<歌曲 歌名="Yesterday" 时间="1:53" 分级="5"/>
<歌曲 歌名="Imagine" 时间="3:04" 分级="5"/>
<歌曲 歌名="All You Need Is Love" 时间="3:52" 分级="4"/>
<歌曲>
<歌名>Come Together</歌名>
<时间>4:18</时间>
<分级>4</分级>
</歌曲>
<歌曲 演唱者="约翰列侬">
<歌名>Oh My Love</歌名>
<时间>2:44</时间>
<分级>5</分级>
</歌曲>
<最后一次修改 修改人="" 时间="">无修改内容<最后一次修改>
</歌曲列表>
================================================================================
这个例子应该可以充分展现XML比数据库更灵活的一面,虽然每一条记录都是存贮一首歌的歌名,时间,分级这三项信息,但我们有多种存贮方法可选,既可以把数据放在标记的属性里,也可以把数据放到下一级标记里显示,像上例那样,两者共存也没问题。同时,XML也没有规定当你第一条记录有多少列时,你第二条记录也一定要有那么列,就上例而言,我们完全可以再加一条歌曲记录,只指定歌名和时间而不分级。至于每一条记录的标签(如1-5条中的"歌曲"),可以重复也可以不同,你看,我就在最后加了一个完全与前面不同的"最后一次修改"标签。总之,XML在要求语法合法的同时也给了开发人员充足的自由,以前在数据库里要用几个表才能记录的事,我们现在可以通通放在一个XML中了。下面,我一步一步来演示如何读写其中的任何一个元素。
首先,像打开数据库一样,我们也得打开我们的XML文件。像这样:
Set rootXML = server.CreateObject("MSXML.DOMDocument")
rootXML.load server.MapPath("XML/config.xml")
“MSXML.DOMDocument是windows”的一个标准组件,每台机器上都有的,请放心使用。
然后,为了能够操作文件里的各项数据,我们再建一个类似游标的变量root,并把它指向XML文件的根标记(也就是<歌曲列表>):
Set root = rootXML.documentelement
如果我们把XML文档看成是一个由一级一级的标记组成的树型结构,那现在,我们的root对象表示的就是文档的根标记,也就是第一级节点(一个XML文件中,根标记必须是唯一的)。所以我们设这么一个root对象就是为了更方便地访问下一级节点,以实现对XML的控制。
就我们示例的这个XML文档而言,它的根标记是<歌曲列表>,它的下一级标记有6个,前五个都是以<歌曲>命名,最后一个是<最后一次修改>,虽然名字不同,但是他们都是同一性质,我们可以把它们一起视为这个XML树型结构的第二级节点。既然我们的root对象已经指向了第一级结点,好,现在
就让我们站在第一级结点上来操作第二级结点。
比如,我们要得到下一级节点的某个标记的文本内容,像<最后一次修改>无修改内容<最后一次修改>中的"无修改内容"这段文本。我们可以如下操作:
先确定该标记是这一级节点中的第几个,此例为6;好,确定后马上行动:
text = root.childNodes.item(5).text
“root.childNodes.item(5).text”这一句代码应该很好理解,用伪代码翻译过来就是“目录.子目录集合.集合中的第5个标记.标记的文本内容”,因为XML的元素索引是从0开始的,所以我们获取某个位置的标记时,一点要记着把位置数减1再执行操作,否则就会越界。比如我们要获取下一级节点的第一个标记的文本,我们就应该用“root.childNodes.item(0)”,而不是“root.childNodes.item(1)”
为了方便,我们将“获取下一级标记的内容”这一操作写成函数,以便重用:
Function getNodeText(ByVal nNode)
getNodeText = root.childNodes.item(nNode).text
End Function
有了这个函数后,我们再要得到“无修改内容”时就只需用如下代码:
text = getNodeText(5)
既避免了出错,也减轻了输入工作。与之相反,修改下一级标记的内容的代码是:
root.childNodes.item(nNode).text = 要修改成的字串,我们同样写成一个函数——
Function setNodeText(ByVal nNode, ByVal strNewNodeText)
root.childNodes.item(nNode).text = strNewNodeText
End Function
现在,我们要将“无修改内容”改成“第一条记录已经更改”,就可以这样:
setNodeText 5,"第一条记录已经更改"
(修改后请用rootXML.Save(文件名)方法保存文件,以使修改生效。)
OK!我们已经可以方便地对下一级标记的进行读取和修改了,好,下一个目标,标记的属性。
我们先回顾一下我们的第二级节点中的第一个标记的内容:
<歌曲 歌名="Yesterday" 时间="1:53" 分级="5"/>
这是一种特殊表达方式,只有首标签<歌曲>,而没有尾标签</歌曲>,更没有夹在两个标签之间的文本内容,而直接以一个“/”结束。呵呵,我是个懒人,所以我比较偏向于这种省略尾标签的写法。但我们用这种省略写法的时候,我们就没法在首尾标签中添加数据了,更没法使用我们上面定义的两个函数。这时候,标记的属性给我们提供了存贮数据的唯一容器,上面这个标记中就存贮着3组属性,下面让我们来试着访问它:
text = root.childNodes.item(0).attributes.item(0).value
这段代码让text变量被赋予了"Yesterday"这个字串,不信你打印一下。用伪代码解释之:
“目录.下一级目录.第0个标记.标记的属性集合.集合中的第0个属性.属性对应的值”
废话少说,写成函数
Function getAttValue(ByVal nNode, ByVal nAtt)
getAttValue=root.childNodes.item(nNode).attributes.item(nAtt).value
End Function
以后就可以很方便地用text = getAttValue(0,0)得到下一级节点中第0个标记的第0个属性值了,
属性也是从0开始索引,切记。
至于修改属性,很简单,直接赋值既可,写成函数表示:
Function setAttValue(ByVal nNode, ByVal nAtt, ByVal strNewAttValue)
root.childNodes.item(nNode).attributes.item(nAtt).value=strNewAttValue
End Function
好,一旦我们发现“All You Need Is Love”这首歌太好听了,想把它的等级升成5,就可以这样做
setAttValue 2,2,"5"
最后,记得使修改生效,也就是在操作后使用rootXML.Save(文件名)这一方法。
Tags:函数
用fso\用ado.stream写xml文件 (2008-7-23 7:20:54)
操作文本的精典Function函数ASP+FSO (2008-7-22 10:23:7)
数据操作函数 (2008-6-25 7:49:46)
几种过滤HTML代码的应用 (2008-4-27 10:33:17)
ASP防注入危险字符代码 (2008-4-10 18:56:43)
GOODTEXT.ORG留言本 V 1.0 (2008-3-30 22:3:32)
留言管理部分代码 留言本制作过程(3) (2008-3-30 21:5:59)
显示留言部分代码 GOODTEXT.ORG留言本制作过程(2) (2008-3-30 20:57:14)
数据库结构设计与链接 GOODTEXT.ORG留言本制作过程(1) (2008-3-27 18:58:58)
CSS样式控制网页背景(背景颜色和颜色图片) (2008-3-22 12:44:4)