У меня нет возможности реструктурировать этот XML ... на самом деле вы делаете с XSLT , языком специального назначения, предназначенным для преобразования файлов XML и MSXML может запускать сценарии XSLT 1.0.
Просто объедините HEADER и ReportBody в один узел, такой как REPORT (который будет именем таблицы доступа). Затем импортируйте этот преобразованный XML с Access ' Application.ImportXML .
XSLT (сохранить как файл .xsl, специальный файл .xml)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNameSpaceSchemaLocation="CMCReports.xsd"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<data>
<xsl:apply-templates select="HEADER"/>
</data>
</xsl:template>
<xsl:template match="HEADER|ReportBody">
<REPORT>
<xsl:copy-of select="ModeS|TailNumber"/>
<xsl:copy-of select="Timestamp/*"/>
<xsl:copy-of select="following-sibling::ReportBody/*"/>
</REPORT>
</xsl:template>
</xsl:stylesheet>
XSLT Fiddle Demo (см. Результат в левом нижнем углу)
VBA (разделяет итерацию средства выбора файлов и процесс преобразования, предполагается, что все XML-файлы имеют одинаковую структуру)
Private Sub btn_Import_Click()
On Error GoTo ErrHandle
Dim StrFileName As String
Dim fd As FileDialog
Dim vrtSelectedItem As Variant
' ITERATE THROUGH MULTIPLE FILE PICKER
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd.InitialFileName = "c:\sample\*.xml"
If .Show = -1 Then
For Each vrtSelectedItem In .SelectedItems
' TRANSFORM XML FILE
StrFileName = CombineNodesXML(vrtSelectedItem)
' IMPORT TRANSFORMED XML (APPENDING TO EXISTING)
Application.ImportXML StrFileName, acAppendData
Next vrtSelectedItem
End If
End With
ExitHandle:
Set fd = Nothing
Exit Sub
ErrHandle:
Msgbox Err.Number & " - " & Err.Description, "RUNTIME ERROR", vbCritical
Resume ExitHandle
End Sub
Public Function CombineNodesXML(xmlfile As Variant) As String
On Error GoTo ErrHandle
Dim xmldoc As New MSXML2.DOMDocument, xslDoc As New MSXML2.DOMDocument, newDoc As New MSXML2.DOMDocument
Dim outputfile As String
outputfile = Replace(xmlfile, ".xml", "_transformed.xml")
' LOAD XML AND XSL FILES
xmlDoc.async = False
xmlDoc.Load xmlfile
xslDoc.async = False
xslDoc.Load "C:\Path\To\XSLT_Script.xml" ' REPLACE WITH ABOVE XSLT PATH
' TRANSFORM AND SAVE XML
xmldoc.transformNodeToObject xslDoc, newDoc
newDoc.Save outputfile
' RETURN OUTPUT PATH
CombineNodesXML = outputfile
ExitHandle:
' RELEASE OBJECTS
Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
Exit Function
ErrHandle:
Msgbox Err.Number & " - " & Err.Description, "RUNTIME ERROR", vbCritical
Resume ExitHandle
End Sub