好学IT学院:IT信息技术分享交流平台
标签:ASP  来源:互联网  作者:华夏名网  发布时间:2008-05-02  ★★★加入收藏〗〖手机版
摘要:在此之前,我写了两篇关于asp结合xml的贴子,分别介绍了用xml取代数据库和用xml整合数据库这两方面的技术,让数据库在某种情况下不再是我们的唯一选择。而xml跟传统数据库相比,更有以下长处:更小的文档体积,更灵活的数据存贮,更方便的文档读写(因为xml是文…

在此之前,我写了两篇关于asp结合xml的贴子,分别介绍了用xml取代数据库和用xml整合数据库这两方面的技术,让数据库在某种情况下不再是我们的唯一选择。而xml跟传统数据库相比,更有以下长处:更小的文档体积,更灵活的数据存贮,更方便的文档读写(因为xml是文本文档,所以无需专门的软件制作和维护),而且xml技术也是网络发展的大势所趋(从.net对xml全面的支持便可见一斑了)。假如有兴趣的话,让我们一起来写一些自己的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(文档名)这一方法。

当能够读写一个xml文档的文本内容和属性值后,我想您也应该基本上能够用asp熟练地操作xml文档元素了,赶快将这一技术用在您的asp中吧!好,今天就写到这里,下次再写时我再附上删除属性、创建标记、添加标记、删除标记、复制标记、替换标记、按条件查询 等一些没讲完的操作。

我是学java和c++的,假如您不嫌我的vbscript很菜的话,能够将我定义的那些函数直接做成一个文档,要用xml时,就用include语句将其包含之。

以上内容由 华夏名网 收集整理,如转载请注明原文出处,并保留这一部分内容。