遍历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


%>