excel - 在 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:
解决方案
推荐阅读
- bash - Bash 递归删除前导下划线
- javascript - 如何摆脱查询字符串
- python-3.x - 如何从数组数组中获取具有最大值的数组,仅考虑每个数组的一个特定元素
- javascript - 向 HTML 表格的每一列添加输入
- java - maven项目中的NoClassDefFoundError与本地依赖
- java - Android 矢量资产 Tint 没有改变
- javascript - 反应 useRef 钩子:useRef 值不被 useState 函数使用
- python-3.x - YouCompleteMe 不可用:需要使用 Python (3.6.0+) 支持编译的 Vim
- aws-lambda - 具有 lambda-proxy 集成和 API 模型验证的无服务器框架
- python - 在 Matplotlib 中管理同一子图上多行的刻度