VBA XML解析 - 通过子节点循环 [英] VBA XML parsing - looping through child nodes

查看:315
本文介绍了VBA XML解析 - 通过子节点循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我第一次使用VBA解析XML文件的尝试,所以我可能会缺少明显的;
我可以打印这个:

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

使用此代码行:

  Debug.Print Variable.SelectSingleNode(values)。XML 

,其中是其父级的子节点变量



但是我不知道如何循环通过的孩子,并打印1A,2B,3C对

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

解决方案

在这里我们可以看到如何使用MSXML6.0库来解析你的具体例子。要使用此示例,您需要在您的VBA项目中添加对MSXML6.0的引用



我建议您支付特别注意XPath变量'// value'和选择器,如.getNamedItem(code)---还有更多的这些您需要熟悉以便流畅的XML解析。幸运的是,这很多都传给HTML解析,所以这是一个有用的技巧!



在这种情况下,我选择了所有的值节点。通过它们迭代就像基于节点数组的长度并使用.item(i)调用一样简单。

  Option Explicit 
Sub test()
Dim strXml As String
strXml =< ;值>< value code =1> A< / value>< value code =2> B< / value>< value code =3 ; /值GT;< /值>中

Dim objXML作为MSXML2.DOMDocument60
设置objXML =新的MSXML2.DOMDocument60

如果不是objXML.LoadXML(strXml)然后'strXML是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
设置myNodes = entry_point.SelectNodes(// value)
如果myNodes.Length> 0然后
对于nNode = 0到myNodes.Length
设置myNode = myNodes(nNode)'获取第一个节点。
如果myNode不是,那么
Else
Debug.Print myNode.Text
Debug.Print myNode.Attributes.getNamedItem(code)。Text
End If
下一个nNode
Else
Debug.Print找不到节点。
如果

End Sub

这里是另一种情况,我选择所有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作为MSXML2.DOMDocument60
设置objXML =新的MSXML2.DOMDocument60

如果不是objXML.LoadXML(strXml)然后'strXML是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
设置myNodes = entry_point.SelectNodes(// values)
如果myNodes.Length> 0然后
对于nNode = 0到myNodes.Length - 1
设置myNode = myNodes(nNode)
如果myNode不是,然后
Else
设置myChildNodes = myNode。 ChildNodes'获取第一个节点的子节点。
对于nChildNode = 0到myChildNodes.Length - 1
Debug.Print myChildNodes(nChildNode).Text
Debug.Print myChildNodes(nChildNode).Attributes.getNamedItem(code)。Text
下一个nChildNode
End If
下一个nNode
Else
Debug.Print找不到节点。
如果

End Sub


This is my first attempt at parsing XML files using VBA, so I may be missing the obvious; I can already print this:

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

using this code line:

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

, where values is a child node of its parent Variable

But I can't figure out is how to loop through the values's children, and print the "1A", "2B", "3C" pairs

As far as I can understand, this question uses the first child of the root, while my goal is to get deeper into a multiple-leveled structure.

解决方案

Here we can see how to use the MSXML6.0 Library to Parse XML for your particular example. To use this example, you need to add a reference to MSXML6.0 in your VBA project.

I suggest you pay particular attention to the XPath variable '//value' and selectors such as .getNamedItem("code") --- there are many more of these that you would need to familiarize yourself with in order to become fluent in XML parsing. Fortunately a lot of this passes over into HTML parsing so it is a useful skill!

In this case, I have selected ALL value nodes. Iterating through them is as simple as doing a for loop based on the length of the array of nodes and using the .item(i) call.

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

Here is another case where I select all VALUES nodes and then iterate through the children of each VALUES node (assuming that all values nodes only have value children).

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

这篇关于VBA XML解析 - 通过子节点循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆