VBA XML解析 - 通过子节点循环 [英] VBA XML parsing - looping through child nodes
问题描述
这是我第一次使用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屋!