我正在寻找一种循环遍历
XML文档的所有节点的方法.
XML文件示例
<root> <llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> <llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> </llnode> <llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> </llnode> </llnode> <llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> <llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> </llnode> <llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0"> <Nickname domain=""/> <MajorMinorContainer>false</MajorMinorContainer> </llnode> </llnode> </root>
该文档始终具有相同的结构.每个llnode代表一个文件夹.这可能非常深(为了上面的例子,范围只有2,但它可以达到10).
我怎样才能遍历所有记录?我不想将循环放入循环然后再循环另外一个循环并执行20次以确保处理每个节点.有没有办法只做循环循环?
下面是我到目前为止所做的,只适用于实际的XML文档(范围= 2),需要添加尽可能多的循环,范围增加(它不应超过范围= 10)
原始VBA(来自原始问题)
xmlExportDoc = "myXmlDoc.xml" Set xmlDoc = New MSXML2.DOMDocument xmlDoc.Load (xmlExportDoc) Set xmlNodeList = xmlDoc.SelectNodes("//llnode") For Each Node In xmlNodeList MsgBox "Listing the EXISTING nodes" MsgBox Node.nodeName & " " & Node.NodeValue & " " & Node.NodeType If Node.HasChildNodes() Then MsgBox Node.nodeName & "has child nodes" Set xmlNodeList2 = Node.ChildNodes For Each Node2 In oNodeList2 MsgBox Node2.nodeName & " " & Node2.NodeValue & " " & Node2.NodeType If Node2.HasChildNodes() Then MsgBox Node2.nodeName & "has child nodes" End If Next End If Next
更新的VBA
Private Function xmlParse(n As MSXML2.IXMLDOMNode) Dim n2 As MSXML2.IXMLDOMNode MsgBox n.nodeName & " " & n.NodeValue & " " & n.NodeType If n.HasChildNodes() Then MsgBox n.nodeName & " has child nodes" For Each n2 In n.ChildNodes xmlParse (n2) Next MsgBox "Done listing child nodes for " & n.nodeName End If End Function
和事件的代码:
Dim xmlExportDoc As String Dim xmlDoc As MSXML2.DOMDocument Dim xmlNodeList As MSXML2.IXMLDOMNodeList,xmlNodeList2 Dim Node As MSXML2.IXMLDOMNode xmlExportDoc = "http://myserver.com/myDoc.xml" Set xmlDoc = New MSXML2.DOMDocument xmlDoc.async = False xmlDoc.Load (xmlExportDoc) Set xmlNodeList = xmlDoc.SelectNodes("//llnode") For Each Node In xmlNodeList Call xmlParse(Node) Next
这仍然不起作用,在执行递归xmlParse()调用时出错,因为MSXML2.IXMLDOMNode.ChildNodes似乎不是MSXML2.IXMLDOMNode类型.
解决方法
我认为你需要的是一个递归函数.我真的不知道VBA语法,所以请原谅伪代码,但你应该可以这样做:
Set xmlNodeList = xmlDoc.SelectNodes("/*/llnode") For Each node in xmlNodeList ListNodes(node) Next Function ListNodes(n As Node) MsgBox n.nodeName & " " & n.NodeValue & " " n.NodeType If n.HasChildNodes() Then MsgBox n.nodeName & "has child nodes" For Each n2 in n.ChildNodes ListNodes(n2) Next MsgBox "Done listing child nodes for " & n.nodeName End If End Function
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。