你的循环完全错误。不要使用计数循环。有For Each
这将完全满足您的需要,而且也更具可读性。
Dim egh_eval As MSXML2.IXMLDOMNode
Dim eval_set As MSXML2.IXMLDOMNode
Dim eval_prop As MSXML2.IXMLDOMNode
Set egh_eval = oDoc.documentElement.childNodes(0)
For Each eval_set In egh_eval.childNodes
If eval_set.nodeType = NODE_ELEMENT Then
For Each eval_prop In eval_set.childNodes
If eval_prop.nodeType = NODE_ELEMENT Then
MsgBox eval_prop.nodeName & " : " & eval_prop.childNodes.length
End If
Next eval_prop
End If
Next eval_set
当你使用childNodes
你必须检查nodeType
财产。注释、文本节点等都会在子节点列表中,而不仅仅是元素节点。
研究使用 XPath 来选择元素可能是个好主意。使用 DOM 方法执行此操作很容易出错且很麻烦。继续阅读IXMLDOMNode::selectNodes http://msdn.microsoft.com/en-us/library/windows/desktop/ms754523%28v=vs.85%29.aspx and IXMLDOMNode::selectSingleNode http://msdn.microsoft.com/en-us/library/windows/desktop/ms757846%28v=vs.85%29.aspx.
For Each eval_set In oDoc.selectNodes("/egh_eval/eval_set")
Set eval_id = eval_set.selectSingleNode("eval_id")
' always check for empty search result!
If Not eval_id Is Nothing Then
MsgBox eval_id.text
' ...
End If
Next eval_set
另外,一般而言。这:
fSuccess = oDoc.Load(Application.CurrentProject.Path & "\file.xml")
实际上既没有必要,也是一个坏主意,因为你似乎从来没有检查过fSuccess
)。更好的:
Sub LoadAndProcessXml(path As String)
Dim oDoc As MSXML2.DOMDocument
If oDoc.Load(path) Then
ProcessXmlFile oDoc
Else
' error handling
End If
End Sub
Sub ProcessXml(doc As MSXML2.DOMDocument)
' Process the contents like shown above
End Sub
创建多个子/函数有几个优点
- 使错误处理变得更加容易,因为每个函数只有一个用途。
- 您将需要更少的变量,因为您可以在函数参数中定义一些变量
- 代码将变得更易于维护,因为 3 个短函数的作用比 1 个长函数的作用更明显。