上下文
在示例Xml文件中,某些数据将采用以下格式:
<A1>
<B1>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B1>
<B2>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B2>
</A1>
<A2>
<B1>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B1>
<B2>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B2>
</A2>
我的问题
我需要迭代节点以获得以下结果:
A1B1C1
A1B1C2
A1B1C3
A1B2C1
A1B2C2
A1B2C3
我尝试了很多次但是无法得到这个结果,任何人都可以帮我解决这个问题。
答案 0 :(得分:2)
首先,我建议使用“Microsoft XML,vx.x”库,其中x代表可用的最新版本(应为6.0)。在那之后你很高兴。但是,在VBA中使用XML时要考虑的事项是广泛的,以涵盖答案。我将在这里提供代码以获得您想要的输出:
Sub parse_xml()
Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml"
Dim XmlDocument As New MSXML2.DOMDocument60
Dim NodeA As IXMLDOMNode
Dim NodeB As IXMLDOMNode
Dim NodeC As IXMLDOMNode
XmlDocument.Load XmlFileName
For Each NodeA In XmlDocument.DocumentElement.ChildNodes
For Each NodeB In NodeA.ChildNodes
For Each NodeC In NodeB.ChildNodes
Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName
Next NodeC
Next NodeB
Next NodeA
End Sub
请注意,我必须稍微扩展您的文件,以使其成为可以加载到XmlDocument变量中的有效XML文件。我在本例中使用的Xml-File如下:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<A1>
<B1>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B1>
<B2>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B2>
</A1>
<A2>
<B1>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B1>
<B2>
<c1>value</c1>
<c2>value</c2>
<c3>value</c3>
</B2>
</A2>
</data>
这将生成以下输出(我刚刚使用了Debug.Print):
A1B1c2
A1B1c3
A1B2c1
A1B2c2
A1B2c3
A2B1c1
A2B1c2
A2B1c3
A2B2c1
A2B2c2
A2B2c3
最后的注释:与Pierre评论的不同,我认为在VBA中解析XML是一项非常可行的任务。根据我的经验,您只需要我在帖子顶部推荐的库来实际解析文件。我使用相当复杂的XML文件只使用该库进行解析。
编辑:这是代码,只会提取所需A标准的值:
Sub parse_xml()
Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml"
Dim XmlDocument As New MSXML2.DOMDocument60
Dim NodeA As IXMLDOMNode
Dim NodeB As IXMLDOMNode
Dim NodeC As IXMLDOMNode
Dim DesiredA As String: DesiredA = "A2" 'Enter your desired A here
XmlDocument.Load XmlFileName
For Each NodeA In XmlDocument.DocumentElement.ChildNodes
If NodeA.BaseName = DesiredA Then 'This is the new line that selects your desired A
For Each NodeB In NodeA.ChildNodes
For Each NodeC In NodeB.ChildNodes
Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName
Next NodeC
Next NodeB
End If 'End of the If-Statement
Next NodeA
End Sub