Вместо анализа XML заранее жестко запрограммированным NodeName
, который может измениться, как вы указали, просто перебрать все имена узлов и извлечь нужные ячейки. Ниже разбирает весь документ на первые две строки.
Кроме того, для передового опыта избегайте использования Select
, ActiveSheet
, ActiveWorkbook
и др. c. См. Как избежать использования Select в Excel VBA .
Public Function XMLDupCheck()
Dim xmlDoc As MSXML2.DOMDocument60
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
Dim i As Integer
Dim var As Variant
Dim strPathToXMLFile As String
' INITIALIZE AND LOAD XML DOC
Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False
strPathToXMLFile = (Sheet1.[addr] & "308_AKT_PK_306_20200418.xml")
xmlDoc.validateOnParse = True
If Not xmlDoc.Load(strPathToXMLFile) Then
MsgBox "Problem"
Exit Function
End If
' RETURN LIST OF ALL ELMENTS
Set xmlNodeList = xmlDoc.SelectNodes("/*//*") ' ALL ELEMENTS SKIPS ROOT
'Set xmlNodeList = xmlDoc.getElementsByTagName("*") ' ALL ELEMENTS
' ASSIGN WORKSHEET
With Worksheets("Map")
i = 1
' PARSE ALL NODE NAME AND TEXT TO CELLS
For Each var In xmlNodeList
.Cells(1, i) = var.SelectSingleNode("*").nodeName
.Cells(2, i) = var.SelectSingleNode("*").Text
i = i + 1
Next var
End With
End Function
Выход
Если вы хотите исключить некоторые узлы, включите If
или Select Case
logi c:
For Each var In xmlNodeList
Select Case var.nodeName
Case "VehicleJourney", "VehicleJourneyTimingLink", "JourneyPatternTimingLinkRef", "RunTime"
Case Else
.Cells(1, i) = var.nodeName
.Cells(2, i) = var.Text
i = i + 1
End Select
Next var