如何用VBA在导入XML至Excel前删除<is_summary>子节点?
解决方法
可以通过MSXML2.DOMDocument加载XML文件,遍历并删除所有<is_summary>节点后,再将处理后的XML导入Excel。以下是两种可行的实现方案:
方案1:临时文件中转导入
先处理XML并保存为临时文件,再通过原有的OpenXML方式导入,逻辑更贴近你原本的代码流程:
Sub matomoImportXML() Dim xmlDoc As Object Dim nodes As Object Dim i As Integer Dim matomoXML As Workbook Dim tempXmlPath As String ' 初始化XML文档对象 Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0") xmlDoc.async = False xmlDoc.validateOnParse = False ' 加载目标XML文件 If xmlDoc.Load(matomo_xml) Then ' 获取所有<is_summary>节点 Set nodes = xmlDoc.SelectNodes("//is_summary") ' 从后往前删除节点(避免索引混乱导致漏删) For i = nodes.Length - 1 To 0 Step -1 nodes(i).ParentNode.RemoveChild nodes(i) Next i ' 生成系统临时文件路径 tempXmlPath = Environ("TEMP") & "\temp_matomo_data.xml" ' 保存处理后的XML到临时文件 xmlDoc.Save tempXmlPath ' 导入处理后的XML到工作簿 Application.DisplayAlerts = False Set matomoXML = Workbooks.OpenXML(FileName:=tempXmlPath, LoadOption:=xlXmlLoadImportToList) Application.DisplayAlerts = True ' 复制数据到目标工作表 matomoXML.Sheets(1).UsedRange.Copy report.Sheets(matomo_data).Range("A1") ' 清理临时文件与对象 matomoXML.Close False Kill tempXmlPath Else ' XML加载失败提示 MsgBox "XML文件加载失败:" & xmlDoc.parseError.reason End If Set xmlDoc = Nothing Set nodes = Nothing Set matomoXML = Nothing End Sub
关键说明
- 用
//is_summaryXPath表达式精准定位所有目标节点,无需逐层遍历XML结构 - 从后往前删除节点:如果从前往后删除,节点集合的索引会随删除操作动态变化,导致部分节点漏删
- 临时文件使用系统临时目录,避免权限问题,处理完成后自动删除
方案2:直接写入工作表(无需临时文件)
如果XML数据量不大,可直接遍历处理后的DOM节点,将数据写入目标工作表,省去文件中转步骤:
Sub matomoImportXML_DirectWrite() Dim xmlDoc As Object Dim rowNodes As Object Dim colNodes As Object Dim i As Integer, j As Integer Dim targetSheet As Worksheet Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0") xmlDoc.async = False xmlDoc.validateOnParse = False If xmlDoc.Load(matomo_xml) Then ' 删除所有<is_summary>节点 Set nodes = xmlDoc.SelectNodes("//is_summary") For i = nodes.Length - 1 To 0 Step -1 nodes(i).ParentNode.RemoveChild nodes(i) Next i ' 获取所有<row>节点 Set rowNodes = xmlDoc.SelectNodes("//row") Set targetSheet = report.Sheets(matomo_data) ' 清空目标工作表原有数据(可选) targetSheet.UsedRange.Clear ' 写入表头 If rowNodes.Length > 0 Then Set colNodes = rowNodes(0).ChildNodes For j = 0 To colNodes.Length - 1 targetSheet.Cells(1, j + 1).Value = colNodes(j).BaseName Next j ' 逐行写入数据 For i = 0 To rowNodes.Length - 1 Set colNodes = rowNodes(i).ChildNodes For j = 0 To colNodes.Length - 1 targetSheet.Cells(i + 2, j + 1).Value = colNodes(j).Text Next j Next i End If Else MsgBox "XML文件加载失败:" & xmlDoc.parseError.reason End If Set xmlDoc = Nothing Set rowNodes = Nothing Set colNodes = Nothing Set targetSheet = Nothing End Sub
内容的提问来源于stack exchange,提问作者NicoF
相关产品推荐
相关产品推荐

