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