Análisis XML DOM en VBA Excel – Padres e hijos

Me gustaría extraer de este file xml una list de "serialnum" para todas las pistas, junto con la "categoría" del disco compacto principal de cada serialnum. Es decir

00001 Type A 00002 Type A ... 00007 Type B 00008 Type B 

Descubrí cómo extraer una list de nums en serie, pero ¿cómo extraigo la categoría asociada de algunos niveles "arriba" de la cadena XML? Me siento cómodo networkingimensionando la matriz, pero la dejé al 100 por simplicidad. También me siento cómodo con las matrices multidimensionales, ¿entonces quizás podría escribir una matriz 2D que contenga "Número de serie" en la primera columna y "Categoría" en la segunda columna? Me siento cómodo escribiendo un bucle (o un bucle en un bucle) para iterar a través de ese escenario, pero ¿cómo puedo solicitar el valor de "categoría" para cada número de serie? Gracias.

XML:

 <?xml version="1.0"?> <compactdiscs> <compactdisc category="Type A"> <artist type="individual">Frank Sinatra</artist> <title numberoftracks="4">In The Wee Small Hours</title> <tracks> <track serialnum="00001">In The Wee Small Hours</track> <track serialnum="00002">Mood Indigo</track> <track serialnum="00003">Glad To Be Unhappy</track> <track serialnum="00004">I Get Along Without You Very Well</track> </tracks> <price>$12.99</price> </compactdisc> <compactdisc category="Type B"> <artist type="band">The Offspring</artist> <title numberoftracks="5">Americana</title> <tracks> <track serialnum="00005">Welcome</track> <track serialnum="00006">Have You Ever</track> <track serialnum="00007">Staring At The Sun</track> <track serialnum="00008">Pretty Fly (For A White Guy)</track> </tracks> <price>$12.99</price> </compactdisc> </compactdiscs> 

VBA (Excel). Este código simplemente extrae una list de numbers de serie, sin datos de "categoría", pero quiero agregar datos de "categoría".

 Sub CDload() 'Create new sheet for ouput 'Set x = ThisWorkbook.Worksheets.Add 'define the object and load the first XML sheet Set Target_XML_File = CreateObject("Microsoft.XMLDOM") Target_XML_File.Load (ActiveWorkbook.Path & "\CDs.xml") Set CurrentNode = Target_XML_File.SelectNodes("/compactdiscs/compactdisc/tracks/track/@serialnum") Dim arrayx() As String ReDim arrayx(100, 0) For i = 0 To (CurrentNode.Length - 1) arrayx(i, 0) = CurrentNode(i).NodeValue Next i 'write array to worksheet, starting on row 2 ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(101, 1)) = arrayx End Sub 

Respondí mi propia pregunta. La solución es usar la syntax .ParentNode combinada con la syntax .getAttribute ("XXXXXX"). Tenga en count que también cambié la syntax de "seleccionar nodo" para que en lugar de seleccionar inicialmente el atributo, select el elemento y luego use la syntax "getattribute (" XXXXXX "). Consulte el código de trabajo a continuación.

 Sub CDload() 'define the object and load the first XML sheet Set Target_XML_File = CreateObject("Microsoft.XMLDOM") Target_XML_File.async = False Target_XML_File.Load (ActiveWorkbook.Path & "\CDs.xml") Set CurrentNode = Target_XML_File.SelectNodes("/compactdiscs/compactdisc/tracks/track") Dim arrayx() As String ReDim arrayx(100, 0) Dim arrayx2() As String ReDim arrayx2(100, 0) For i = 0 To (CurrentNode.Length - 1) arrayx(i, 0) = CurrentNode(i).getAttribute("serialnum") arrayx2(i, 0) = CurrentNode(i).ParentNode.ParentNode.getAttribute("category") Next i 'write array to worksheet, starting on row 2 ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(101, 1)) = arrayx ActiveSheet.Range(ActiveSheet.Cells(1, 2), ActiveSheet.Cells(101, 2)) = arrayx2 End Sub