是否可以使用VBA在XML中使用特定标记名称循环访问子节点?

时间:2017-08-08 10:23:50

标签: xml vba excel-vba excel

例如,我想只遍历" test"的子节点。标签名称"结果"。

  <test>

    <result>
    </result>
    <memo1>
    </memo1>

    <result>
    </result>

    <memo2>
    </memo2>

    <result>
    </result>

    <memo3>
    </memo3>


  </test>

我认为this可能提供我想要的东西。但是,我并没有完全了解它是如何工作的(如果它确实提供了我想要的东西)。

1 个答案:

答案 0 :(得分:1)

以下是使用XML数据的示例。我非常确定你的XML文件必须在第一行有<?xml version='1.0'?>。但除此之外,这就是它的工作原理:

Sub testXMLLoop()
    Dim xml As String
    xml = "<?xml version='1.0'?>" & _
    vbCrLf & "  <test>" & _
    vbCrLf & "    <result>" & _
    vbCrLf & "    </result>" & _
    vbCrLf & "    <memo1>" & _
    vbCrLf & "    </memo1>" & _
    vbCrLf & "    <result>" & _
    vbCrLf & "    </result>" & _
    vbCrLf & "    <memo2>" & _
    vbCrLf & "    </memo2>" & _
    vbCrLf & "    <result>" & _
    vbCrLf & "    </result>" & _
    vbCrLf & "    <memo3>" & _
    vbCrLf & "    </memo3>" & _
    vbCrLf & "  </test>"
    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")
    xmlDoc.LoadXML xml
    'xmlDoc.Load "file\path\to\books.xml"
    If (xmlDoc.parseError.ErrorCode <> 0) Then
        Dim myErr As Object
        Set myErr = xmlDoc.parseError
        Debug.Print "You have error " + myErr.reason
    Else
        Dim objNodeList As Object
        Set objNodeList = xmlDoc.getElementsByTagName("test")
        Dim oTestList, oChild As Object
        For Each oTestList In objNodeList
            For Each oChild In oTestList.ChildNodes
                if oChild.nodeName = "result" then
                    'Do stuff with oChild
                    Debug.Print oChild.nodeTypedValue
                end if
            Next
        Next
    End If
End Sub