VBA XMLparsing – 循环通过子节点

这是我第一次尝试使用VBAparsingXML文件,所以我可能会错过显而易见的; 我已经可以打印这个了:

<values> <value code="1">A</value> <value code="2">B</value> <value code="3">C</value> </values> 

使用这个代码行:

 Debug.Print Variable.SelectSingleNode("values").XML 

,其中的values是其父Variable的子节点

但我不知道如何循环values的孩子,并打印“1A”,“2B”,“3C”对

据我所知, 这个问题使用根的第一个孩子,而我的目标是深入到一个多层次的结构。

在这里,我们可以看到如何使用MSXML6.0库为您的特定示例parsingXML。 要使用此示例,您需要在VBA项目中添加对MSXML6.0的引用。

我build议你特别注意XPathvariables“// value”和诸如.getNamedItem(“code”)之类的select器—还有更多这些你需要熟悉才能成为stream利的XMLparsing。 幸运的是,很多这些都转化成了HTMLparsing,所以它是一个非常有用的技巧!

在这种情况下,我select了所有的值节点。 遍历它们就像根据节点数组的长度并使用.item(i)调用进行for循环一样简单。

 Option Explicit Sub test() Dim strXml As String strXml = "<values><value code=""1"">A</value><value code=""2"">B</value><value code=""3"">C</value></values>" Dim objXML As MSXML2.DOMDocument60 Set objXML = New MSXML2.DOMDocument60 If Not objXML.LoadXML(strXml) Then 'strXML is the string with XML' Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason End If Dim entry_point As IXMLDOMNode Set entry_point = objXML Dim myNodes As IXMLDOMNodeList Dim myElement As IXMLDOMElement Dim myNode As IXMLDOMNode Dim nNode As Integer Set myNodes = entry_point.SelectNodes("//value") If myNodes.Length > 0 Then For nNode = 0 To myNodes.Length Set myNode = myNodes(nNode) ' Get the first node. If myNode Is Nothing Then Else Debug.Print myNode.Text Debug.Print myNode.Attributes.getNamedItem("code").Text End If Next nNode Else Debug.Print "No nodes found." End If End Sub 

这里是另一种情况,我select所有的VALUES节点,然后遍历每个VALUES节点的子节点(假设所有的值节点只有值子节点)。

 Option Explicit Sub test() Dim strXml As String strXml = "<values><value code=""1"">A</value><value code=""2"">B</value><value code=""3"">C</value></values>" Dim objXML As MSXML2.DOMDocument60 Set objXML = New MSXML2.DOMDocument60 If Not objXML.LoadXML(strXml) Then 'strXML is the string with XML' Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason End If Dim entry_point As IXMLDOMNode Set entry_point = objXML Dim myNodes As IXMLDOMNodeList Dim myChildNodes As IXMLDOMNodeList Dim myElement As IXMLDOMElement Dim myNode As IXMLDOMNode Dim myChildNode As IXMLDOMNode Dim nNode As Integer Dim nChildNode As Integer Set myNodes = entry_point.SelectNodes("//values") If myNodes.Length > 0 Then For nNode = 0 To myNodes.Length - 1 Set myNode = myNodes(nNode) If myNode Is Nothing Then Else Set myChildNodes = myNode.ChildNodes ' Get the children of the first node. For nChildNode = 0 To myChildNodes.Length - 1 Debug.Print myChildNodes(nChildNode).Text Debug.Print myChildNodes(nChildNode).Attributes.getNamedItem("code").Text Next nChildNode End If Next nNode Else Debug.Print "No nodes found." End If End Sub 

使用HTML或XML元素的关键是使用LocalsWatch窗口来浏览元素的属性。 子项目将在childNode ,子项目或item集合中。 我还将在Chrome中打开文档,单击我的目标元素,并在适用时使用复制XPath。 我可以使用XPath来追踪我的目标元素。

在这个例子中,我把Stop设置在我的目标节点所在的行之后。 接下来,我深入了解节点的属性(在“ Immediate Window进行testing),直到find所需的属性。

在这里输入图像描述

 Sub TestStub() Const XMLTEST = "<values>" & _ "<value code=""1"">A</value>" & _ "<value code=""2"">B</value>" & _ "<value code=""3"">C</value>" & _ "</values>" Dim objXML As Object, node As Object Set objXML = CreateObject("MSXML2.DOMDocument") If Not objXML.LoadXML(XMLTEST) Then 'strXML is the string with XML' Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason Else Set node = objXML.SelectSingleNode("values") Stop End If End Sub 

更新:如何使用Immediate Windowtesting在childNodes集合中的项目循环

在这里输入图像说明