Approfittero' anche io del video per una lezione intensiva su PowerQuery.
Nel frattempo, una ipotesi anche con macro.
Procedimento:
1)
Partri da un nuovo file Excel, e su Foglio1 (il nome non e' importante) in riga 1 ci metti i nomi dei "Nodi" che vuoi leggere (sottostanti il nodo pricipale, root element, che nel nostro caso e' il tag ItacWorkItem) e degli "Attributi" che vuoi leggere.
Eventuali gerarchie vanno indicate con uno "/", mentre eventuali "Attributi" vanno preceduti dal segno "#".
Con riferimento al tuo caso, le prime 5 intestazioni saranno quindi:
- Codice: Seleziona tutto
ShortTitle
LongTitle
ItacAcademyItem
ItacAcademyItem#AcademyId
ItacAcademyItem#RecordID
In colonna G c'e' un caso di nodi gerarchici:
- Codice: Seleziona tutto
City/PublicationPlaceItalianName
In colonna R c'e' un Attributo da riferire al secondo livello gerarchico, e sara' indicato
- Codice: Seleziona tutto
Printers/ItacPersonItem#PersonId
In Colonna X c'e' un attributo riferito al root element, e sara' indicato
- Codice: Seleziona tutto
#RecordId
Queste intestazioni devono corrispondere a quanto presente nel sorgente xml, rispettando Maiuscolo/Minuscolo
2)
In questo file, in un Modulo standard del vba inserisci questa macro:
- Codice: Seleziona tutto
Sub XMLParse()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=110596
'
'Richiede il riferimento alla libreria Microsoft XML:
' in Menu /Strumenti /Riferimenti, cercare "Microsoft XML V.xx" e Spuntarla
'
Dim myF As String, MasterN As String, mySplit, myNext As Long
Dim xmlDoc As Object, I As Long, myPath As String, fCnt As Long
'
''myF = "D:\DDownloads\byALESSIO_9899\023-000003205.xml"
'
MasterN = "//ItacWorkItem" '<<< Nodo principale
myPath = ThisWorkbook.Path '<<< Il percorso dei file xml
'
Set xmlDoc = New MSXML2.DOMDocument
'
myF = Dir(myPath & "\*.xml") 'Cerca file xml
Do While myF <> ""
fCnt = fCnt + 1
xmlDoc.Load (myF) 'Carica xmlDoc
myNext = Cells(Rows.Count, 1).End(xlUp).Row + 1
On Error GoTo gErr '
For I = 1 To Cells(1, Columns.Count).End(xlToLeft).Column 'per ogni intestazione colonna
If InStr(1, Cells(1, I).Value, "#", vbTextCompare) <> 0 Then 'Verifica se "attributo"
mySplit = Split("/" & Cells(1, I).Value, "#", , vbTextCompare) 'Gestion Attributo
If UBound(mySplit) > 0 Then
If Len(mySplit(0)) < 3 Then mySplit(0) = ""
Cells(myNext, I) = xmlDoc.SelectSingleNode(MasterN & mySplit(0)).Attributes.getNamedItem(mySplit(1)).Text
End If
Else 'Gestion ItemText
Cells(myNext, I) = xmlDoc.SelectSingleNode(MasterN & "/" & Cells(1, I).Value).Text
End If
Next I
DoEvents
myF = Dir 'Cerca altri file
Loop
'Fine:
Set xmlDoc = Nothing
MsgBox ("Completata importazione; n° file: " & fCnt)
Exit Sub
gErr: 'In caso di errore, scrive ****
Cells(myNext, I) = "****"
Resume Next
'
End Sub
Per inserire il codice, vedi
viewtopic.php?f=26&t=103893&p=647675#p647675La macro richiede che sia impostato il riferimento alla libreria Microsoft XML; dall'editor delle macro:
-Menu /Strumenti /Riferimenti, cerca "Microsoft XML V.xx" e Spuntala; premi Ok
Per adattarlo ad altre strutture, l'istruzione
MasterN = etc etc va personalizzata col nome del "root element".
Quando il file e' pronto salvalo in formato ".xlsm" (macro enabled)
3)
Infine manda in esecuzione la Sub XMLParse
Questa aprira' in sequenza i singoli file xlm e ne estrarra' gli ItemText elencati nell'intestazione.
In caso di errore (es un nodo o attributo mancante) la cella sara' compilata con ****
Un messaggio informera' del completamento delle operazioni.
Fai sapere...