遍历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
%>
xml中element循环
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
下一篇:数据库表转java实体在线
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章