S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
如何用Asp读写XML文件及XML存取数据的优点
2008-07-08 11:11
看代码和注释,先了解一下ASP是如何读写XML文件的。

'// 首先定义和创建XML对象
Dim oXML,oXMLRoot,oXMLItems,oXMLLinks,oXMLItem,iLength,i

Set oXML = CreateObject("Microsoft.XMLDOM") '// 或 MSXML2.DOMDocument

'// 然后加载XML文档
oXML.load "XML文件地址" '// 或:oXML.loadXML "XML内容"

'// 内容加载完成后,现在来加载它的节点信息
'// 获取XML所有节点

Set oXMLRoot = oXML.documentElement
'// 获取节点
Set oXMLItems = oXMLRoot.selectNodes("ExampleNode")

'// 此时oXMLItems 变量中已经包含了所有ExampleNode节点的内容。
'// 如果要获取它下面的ExampleSubNode节点的话,用以下语句
'// 获取节点,设ExampleNode节点只有一个,那么0即是它的内容
oXMLLinks = oXMLItems(0).selectNodes("ExampleSubNode")
'// 获取节点长度(个数)
iLength = oXMLLinks.length - 1

For i = 0 To iLength
Set oXMLItem = oXMLLinks.item(i)
'// 用 getAttribute 方法来获取它的属性值
oXMLItem.getAttribute("ID")
'// 用 selectSingleNode 方法来获取它的节点值
oXMLItem.selectSingleNode("Name").text
Next
'// 释放XML对象
Set oXMLItem = Nothing
Set oXMLLinks = Nothing
Set oXMLItems = Nothing
Set oXMLRoot = Nothing
Set oXML = Nothing

上面的代码可以说是一个ASP读取XML文件的基本流程,一般的用这个也就够了。下面看一个例子来说明ASP如何读写XML文件以及ASP读写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中吧!好,今天就写到这里,下次再写时我再附上删除属性、创建标记、添加标记、删除标记、复制标记、替换标记、按条件查询 等一些没讲完的操作。

Feedback

# re: 如何用Asp读写XML文件及XML存取数据的优点  回复  更多评论   

2009-09-23 11:31 by ananbel
C++高级工程师
基本要求:
 计算机方面学士学位以上的学历;
 8以上的C/C++或Java的编程经验;
 能够进行比较熟练的英语听、说、读、写;
 善于和具有团队的工作经验,沟通能力强;

专业技能要求:
 深刻理解和掌握OOP面向对象的编程思想和技能;
 深刻理解和掌握软件工程的技术,做过详细设计;
 掌握各平台下(Windows,Linux,Unix)的API设计和编程技能;
 掌握跨平台的应用设计和编程的技术;
 具有大系统设计和研发的经验;
有特殊技能 QT


图形图像研发人员
基本要求:
 计算机科学学士学位以上的学历;
 能够进行比较熟练的英语听、说、读、写;
 善于与他人进行交流和沟通;
 2年以上的图形图像工作经历;

专业技能要求:
 熟练掌握C/C++或Java语言;
 熟练掌握面向对象的编程技术和思想;
 熟悉Photoshop等图形图像处理软件的使用;
 熟悉图形图像格式转换、编解码,能够实现各种通用图像效果算法;
 若音视频,对一帧一帧的叠加效果有操作经验;
 若做过地理信息,通用图片的底层编辑
资深软件测试员
基本要求:
 计算机方面专科以上的学历;
 4年以上的软件测试经验;
 具备良好的英语听、说、读、写的能力;
 工作认真、细致、 负责;
专业技能要求:
 能够熟练地根据需求编写测试案例;
 熟练掌握软件的功能测试和性能测试的技巧;
 有使用软件测试工具(如WinRunner,LoadRunner)2年以上的经验;
 能够用测试所需的脚本语言编写有关测试程序;
 具有下列经验者优先考虑:
 做过C/C++或Java编程;
 了解面向对象的概念和技术;
 具有一定的行业测试背景;
 编程经验


Web Browser研发人员
基本要求:
 计算机科学学士学位以上的学历;
 能够进行比较熟练的英语听、说、读、写;
 善于与他人进行交流和沟通;
 3年以上的internet研发经历;

专业技能要求:
 熟练掌握C/C++或Java语言;
 熟练掌握网络的7层协议,熟悉互联网的工作原理;
 熟悉互联网的通信协议(http)及各种Web 编程语言(html等);
 悉浏览器相关技术、协议,能够开发浏览器内核程序;
 具有Web Browser开发经验者优先考虑;
资深的Web 应用的开发人员。真正在多用户的、大的网站公司工作过的核心技术人员。
对有基于Google或其他分布式大系统比较了解


annabel@genhr.com 我是上海一家猎头公司的
正在找一些IT的职位。
如果您感兴趣,请发您的联系方式给我,我会及时和您沟通

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理