Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

asp 遍历XML文档

Posted on 2008-09-06 17:51  analyzer  阅读(477)  评论(0编辑  收藏  举报
遍历XML文档
对于下面的一段XML代码:
XML文档实例books.xml,如下所示:

<?xml version="1.0" encoding="gb2312" ?>
<books>
<book status="已售完">
<author>破破</author>
<title>XML入门</title >
</book>
<book status="热卖中">
<author>坏坏</author>
<title>XML提高</title>
</book>
</books>
我们已经可以创建XML文档对象,并加载XML文档了。对于已经加载的文档,我们要从文档中获取所需要的内容,这就要求能够通过DOM树来访问树中的任何一个节点,也就是对DOM树的遍历。

下面我们依旧以books.xml为例,通过几个实例来说明如何遍历DOM树中的节点。

首先,我们要获取XML文档的根元素节点,用VB描述这个操作如下:

Set root = myDocument.documentElement

现在,我们已经得到了文档的根元素节点,对于其他元素,我们如何获得对它的访问呢?以文档中的第二个book元素为例,对该元素节点以及其子节点的访问可以通过下面的方式来实现。

Set bookNode = root.childNodes.item(1)
Set authorNode = bookNode.childNodes.item(0)
Set textNode = authorNode.childNodes.item(0)
Set theName = textNode.nodeValue

上述访问语句执行后,theName的值是"坏坏"。

在上面的代码中,root是文档的根元素节点books节点,bookNode和authorNode都是元素类型的节点,textNode是TEXT类型的节点,theName是一个字符串。

childNodes是NodeList类型的属性,item是NodeList接口中Node类型的属性,通过item可以访问NodeList节点集合中的任意节点(这儿有一点需要注意,当我们要访问根元素节点books的第二个book子节点bookNode时,我们用的索引参数是"1",这是因为item中的索引参数是从0开始的,如果我们要访问节点集合中的第一个节点,则应该用item(0)来表示)。

在DOM规范中,要访问元素节点的文本内容,需要先得到元素节点的TEXT子节点,再通过TEXT节点的属性获取文本内容。微软在实现DOM接口时对DOM进行了部分扩展,可以通过元素类型节点的text属性直接获得元素中的文本内容。具体实用说明可以参考微软msdn中的帮助。

上面的例子给出了如何访问DOM树中的元素节点,对于DOM树中的属性节点,访问方法略有不同,可以通过下面的语句来实现:

Set bookNode = root.childNodes.item(1)
Set attr = bookNode.attributes.getNamedItem("status")
attrContent = attr.nodeValue

上述访问语句执行后,attrContent的值是"热卖中"。

在上面的代码中,attr是属性类型的节点,attributes是NamedNodeMap类型的属性,getNamedItem是NamedNodeMap接口中的方法。属性的内容可以通过属性节点的nodeValue来获得。

//////////////////////////////////////////

<%
Dim xmlDom, rootNode
xmlFileName = "test.xml"
Set xmlDom = Server.CreateObject("Microsoft.XMLDOM")
'set objRetValNode As MSXML.IXMLDOMNode
'set objRetValNode=xmldom.IXMLDOMNode
xmlDom.async = false
If not xmlDom.load(Server.MapPath(xmlFileName)) Then
response.Write ("没有这个会员")
respoonse.end
Else
Set xmlNode = xmlDom.documentElement.childNodes(0)
'Set rootNode = xmlDom.documentElement
'set EYuan=rootNode.selectSingleNode("//UserData/UserInfo/EYuan")
'response.write EYuan
Set objRetValNode = xmlDom.documentElement
Set objRetValNode = xmlDom.selectSingleNode(".//UserData/UserInfo/EYuan")
Response.write objRetValNode.Text
'response.write getNodeList(xmlFileName,"UserName")
' For i = 0 To xmlNode.childNodes.length - 1
'response.write xmlNode.childNodes(i).nodeName
'response.write " "
'response.write xmlNode.childNodes(i).Text
'response.write "<br/>"
'Next
End If

%>

<?xml version="1.0" encoding="gb2312"?>
<UserData>
<UserInfo>
<UserName>testEnte</UserName>
<UserEmail>cecte@163.com</UserEmail>
<EYuan>20</EYuan>
<iDate>2003-12-20 0:03:53</iDate>
</UserInfo>
<其他节点>
<Company>公司名称</Company>
</其他节点>
</UserData>

/////////////////////////////////////////

遍历属性

<%
s="<root><booklist><book name='xml' /><book id='0002' name='asp' /> <book id='0003' name='jsp' /></booklist><bookfav> <item name='xml' id='0001'/> <item name='asp' id='0002'/> <item name='jsp' id='0003'/></bookfav></root>"
set d= server.createobject("msxml2.domdocument")
d.loadXML s
set n = d.selectNodes("//book")
for each node in n
for i = 0 to node.attributes.length - 1
Response.write node.attributes(i).name & "=" & node.attributes(i).value & " "
next
Response.write "<p>"
next
%>



操作xml文档 ////////////////////////////////////////////////////////

Dom操作xml的常用方法

(Dom的全部方法和属性可到vs的对象浏览器察看)



'创建DOM对象

set objDom=server.CreateObject("microsoft.xmldom")



'取得xml数据

'方法1 取得xml文件的xml数据

objDom.load("c:\test.xml")

'方法2 取得xml数据串的数据

objDom.loadxml("&lt;people&gt;&lt;man name="sd"&gt;&lt;/people&gt;")



'创建一个节点对象

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") '要删除的节点的父节点

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



<%

dim xmldoc,node

set xmldoc=server.CreateObject("msxml2.domdocument")

xmldoc.async=false '异步传输

xmldoc.loadXML "<ROOT/>"

xmldoc.createProcessingInstruction "xml","version='1.0' encoding='gb2312'"

set node=xmlCreateNode(xmldoc,xmldoc.documentElement,"user",0,0,"")

xmlCreateNode xmldoc,node,"name",1,1,"ssm1226"

xmlCreateNode xmldoc,node,"name",0,1,"呢称:雨中人"

'*********************************************************

'函数功能:添加子节点或属性

'xmldoc--XML DOM Object

'xmldocObj--要添加目的节点对象

'EleNameOrAttName--节点名或属性名

'Key--0-节点;1-属

'ifTxt--是否有内容0-无;1-有

'Text--当ifTxt=1时有效,内容

'By '版权信息:author:ssm1226 ;data:2003-1-2;copyright:yeboss.net

'*********************************************************

function xmlCreateNode(xmldoc,xmldocObj,EleNameOrAttName,Key,ifTxt,Text)

If Key=0 then

Dim SubNode

set SubNode=xmldoc.createElement(EleNameOrAttName)

if ifTxt=1 then SubNode.text=Text

xmldocObj.appendChild SubNode

set xmlCreateNode=subNode

set SubNode=Nothing

ElseIf Key=1 then

Dim AttNode

set AttNode=xmldoc.createAttribute(EleNameOrAttName)

if ifTxt=1 then AttNode.text=Text

xmldocObj.attributes.setNamedItem AttNode

set xmlCreateNode=AttNode

set AttNode=Nothing

End If

end function

Response.Write xmldoc.xml

%>
我要啦免费统计