首页 > 解决方案 > 在 VBA 中从同名节点获取 XML 数据时出现问题

问题描述

我正在尝试通过 VBA 读取 XML 文件。

我有一个名为 SCL 的节点,其中有多个名为 IED 的节点。

我需要从名为 FCDA 的节点中提取属性,每个 IED 都在同一路径中/SCL/IED/AccessPoint/Server/LDevice/LN0/DataSet/FCDA,并将它们合并。

问题是当我尝试运行我的代码时,它似乎只获得了第一个 IED 节点上的信息,并复制到其他节点中。

我可能做错了什么?

我的代码:


Private Sub CommandButtonImport_Click()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
            .Filters.Clear
            .Title = "Selecione um arquivo SCD"
            .Filters.Add "SCD File", "*.scd", 1
            .AllowMultiSelect = False
        
        If .Show = True Then
            xmlFileName = .SelectedItems(1)
            
            Dim xDoc As Object
            Dim CX As Integer
            Set xDoc = CreateObject("MSXML2.DOMDocument")
            xDoc.async = False: xDoc.validateOnParse = False
            xDoc.Load (xmlFileName)
            
            Set SCL = xDoc.SelectNodes("//SCL/IED")
                For n = 0 To SCL.Length - 1
                    C1 = SCL(n).Attributes.getNamedItem("name").Text
                    C2 = SCL(n).Attributes.getNamedItem("manufacturer").Text
                    C3 = SCL(n).Attributes.getNamedItem("type").Text
                    CX = (4 + (3 * n))
                
                    Worksheets("Gooses").Cells(2, CX) = C1
                    Worksheets("Gooses").Cells(3, CX) = C2
                    Worksheets("Gooses").Cells(4, CX) = C3
                                        Set DSI = xDoc.SelectNodes("//LN0/DataSet")
                
                    
                    For j = 0 To DSI.Length - 1
                         'dsName = DSI(j).Attributes.getNamedItem("name").Text
                         'dsDesc = DSI(j).Attributes.getNamedItem("name").Text
                         'dsX = (4 + (3 * j))
                        
                         'Worksheets("Gooses").Cells(6, dsX) = dsName
                         'Worksheets("Gooses").Cells(7, dsX) = dsDesc
                         
                         Set dsP = xDoc.SelectNodes("//DataSet/FCDA")
                         
                         For k = 0 To dsP.Length - 1
                            
                            ldInst = dsP(k).Attributes.getNamedItem("ldInst").Text
                            Prefix = dsP(k).Attributes.getNamedItem("prefix").Text
                            lnClass = dsP(k).Attributes.getNamedItem("lnClass").Text
                            lnInst = dsP(k).Attributes.getNamedItem("lnInst").Text
                            doName = dsP(k).Attributes.getNamedItem("doName").Text
                            fc = dsP(k).Attributes.getNamedItem("fc").Text
                                
                            dsPoint = ldInst & "." & Prefix & "." & lnClass & "." & lnInst & "." & doName & "." & fc
                            dsPX = (6 + k)
                            
                            If j = 0 Then
                                Worksheets("Gooses").Cells(dsPX, 4) = dsPoint
                            Else
                                Worksheets("Gooses").Cells(dsPX, 4 + (3 * j)) = dsPoint
                            End If
                            
                         Next
                    Next

                Next
            
        End If
    End With
End Sub

还有我正在使用的 XML:

xml

标签: excelxmlvba

解决方案


推荐阅读