在VBA中提取XML节点名称

时间:2016-11-11 12:47:00

标签: excel vba excel-vba xml-parsing

上下文

在示例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

我尝试了很多次但是无法得到这个结果,任何人都可以帮我解决这个问题。

1 个答案:

答案 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