+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Lettura file XML con VBA Access (versione 2010)

  1. #1
    Makino non è in linea Novello
    Post
    32

    Lettura file XML con VBA Access (versione 2010)

    Buongiorno,
    da un "vecchio" post di "Dragone Bianco" (che ringrazio per alcuni spunti risolutivi...) ho imparato che i file XML si possono "leggere" con VBA in Access.
    Sono riuscito a fare qualcosa ma al momento sono bloccato su di una maledetta istruzione che dovrebbe farmi vedere la lista e il relativo contenuto di una serie di 15 "Capitoli" tutti chiamati con lo stesso nome (ItemData/CharacterType)
    L'istruzione che non funziona è praticamente TUTTO il ciclo FOR/EACH nella routine sotto riportata:

    codice:
    Function Leggi_XML()
    Dim Obj As DOMDocument
    Dim Nodo As IXMLDOMNodeList
    Dim Nome As IXMLDOMNode
    Dim Testo As String
    Dim Verifica As Boolean
    
    'accesso al file
    Set Obj = New DOMDocument
    Obj.async = False
    Obj.Load ("C:\Disco_D\Test.xml")
    
    'seleziono il nodo da leggere
    Set Nodo = Obj.documentElement.selectNodes("ItemData/CharacterType")
    
    'leggo tutti i dati del nodo
    For Each Nome In Nodo
        'estraggo il valore del nodo
        Testo = Testo & Nome.Text
        MsgBox Testo
        'Estraggo il nome e il valore della 'attributo
        Testo = Testo & " (" & Nome.Attributes(0).baseName & ":" & Nome.Attributes(0).Text & ")"
        'estraggo Gli attibuti del nodo padre
        Testo = Testo & " [" & Nome.ParentNode.Attributes(0).baseName & ":" & Nome.ParentNode.Attributes(0).Text
        Testo = Testo & " - " & Nome.ParentNode.Attributes(1).baseName & ":" & Nome.ParentNode.Attributes(1).Text & "]"& Chr(13) & Chr(10)
    Next
    
    'chiusura File
    Set Obj = Nothing
    
    'Restituzione valore
    MsgBox Testo
    End Function
    Grato x vostri aiuti/suggerimenti

  2. #2
    Phil_cattivocarattere ora è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,482
    Quote Originariamente inviato da Makino Visualizza il messaggio
    ...da un "vecchio" post di "Dragone Bianco" ...
    che sarebbe stato utile riportare
    [VBA]Lettura e Creazione File XML
    [VBA]Lettura File XML (approfondimento)
    Quote Originariamente inviato da Makino Visualizza il messaggio
    ... sono bloccato su di una maledetta istruzione...
    L'istruzione che non funziona è praticamente TUTTO il ciclo FOR/EACH nella routine sotto riportata:
    Detto così non si capisce niente: ci sono errori o non fa quello che dovrebbe fare?
    E' fondamentale inoltre vedere una porzione significativa del file xml.

  3. #3
    Makino non è in linea Novello
    Post
    32
    Grazie della risposta e delle ri-citazioni dell'articolo. Praticamente il ciclo For Each nn viene assolutamente eseguito. In modalitá passo passo ll' istruzione viene letta ma poi non procede con le istruzioni all'interno del ciclo uscendo immediatamente. Manderò tra poco anche esempio file XML.
    Grazie

  4. #4
    Makino non è in linea Novello
    Post
    32
    Questo è il file XML di partenza
    Naturalmente le informazioni che vorrei estrarre sono un pò dappertutto...
    Grazie alla esempio di Dragone Bianco sono riuscito ad estrapolare dati solamente dalla prima parte del file.
    <Header>
    Ma nei vari <ItemData> non ci va.....
    codice:
      <?xml version="1.0" encoding="utf-8" ?> 
    - <PartTemplate>
    - <Header>
      <ExportVersion>3.1.0</ExportVersion> 
      <SublineId>360</SublineId> 
      <SublineDescription>Tenuta Circuito Acqua</SublineDescription> 
      <PartNumber>5802188208</PartNumber> 
      <MasterTemplateVersion>4</MasterTemplateVersion> 
      <PartTemplateVersion>-1</PartTemplateVersion> 
      <PartGroupId>10</PartGroupId> 
      <PartGroupCode>AAA</PartGroupCode> 
      <SerialNumber>000432623</SerialNumber> 
      <EventDate>2018/01/30 06:40:21</EventDate> 
      </Header>
    - <MasterDataSection>
    - <ItemData>
      <ItemTypeId>14</ItemTypeId> 
      <ItemTypeDescription>Pallet Status</ItemTypeDescription> 
      <Description>Stato Pallet</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>1</FirstByteNumber> 
      <LastByteNumber>1</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value>I</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>1</ItemTypeId> 
      <ItemTypeDescription>Serial Number</ItemTypeDescription> 
      <Description>Serial Number</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>5</FirstByteNumber> 
      <LastByteNumber>13</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value>000432623</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>2</ItemTypeId> 
      <ItemTypeDescription>Part Number</ItemTypeDescription> 
      <Description>Part Number</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>14</FirstByteNumber> 
      <LastByteNumber>28</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue>5802188208</DefaultValue> 
      <Value>5802188208</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>6</ItemTypeId> 
      <ItemTypeDescription>Part Number Description</ItemTypeDescription> 
      <Description>Descrizione Part Number</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>29</FirstByteNumber> 
      <LastByteNumber>43</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value /> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>379</ItemTypeId> 
      <ItemTypeDescription>Customer Code</ItemTypeDescription> 
      <Description>Codice Cliente</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>59</FirstByteNumber> 
      <LastByteNumber>62</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value /> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>4</ItemTypeId> 
      <ItemTypeDescription>Master Template Version</ItemTypeDescription> 
      <Description>Versione Master Template</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>92</FirstByteNumber> 
      <LastByteNumber>95</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue>4</DefaultValue> 
      <Value>4</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>5</ItemTypeId> 
      <ItemTypeDescription>Part Template Version</ItemTypeDescription> 
      <Description>Versione Part Template</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>96</FirstByteNumber> 
      <LastByteNumber>99</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue>-1</DefaultValue> 
      <Value>-1</Value> 
      </ItemData>
      </MasterDataSection>
      <DressingDataSection /> 
    - <ProcessOpDataSection>
    - <OpData>
      <OpId>101</OpId> 
      <OpName>BANCO_1</OpName> 
      <OpRank>100</OpRank> 
      <OpDescription>Banco prova tenuta circuito acqua</OpDescription> 
    - <ItemData>
      <ItemTypeId>54</ItemTypeId> 
      <ItemTypeDescription>Cycle Code</ItemTypeDescription> 
      <Description>Ciclo Macchina</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>100</FirstByteNumber> 
      <LastByteNumber>100</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value>20</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>62</ItemTypeId> 
      <ItemTypeDescription>Operation Status</ItemTypeDescription> 
      <Description>Controllo operativo</Description> 
      <Format>BCD</Format> 
      <FirstByteNumber>101</FirstByteNumber> 
      <LastByteNumber>101</LastByteNumber> 
      <Visible>true</Visible> 
      <RepairBackupOpId>0</RepairBackupOpId> 
      <DefaultValue /> 
      <Value>01</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>61</ItemTypeId> 
      <ItemTypeDescription>Quality Data</ItemTypeDescription> 
      <Description>Numero Prova</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>200</FirstByteNumber> 
      <LastByteNumber>200</LastByteNumber> 
      <Visible>true</Visible> 
      <CharactTypeId>104</CharactTypeId> 
      <CharactTypeDescription>Numero Prova</CharactTypeDescription> 
      <DefaultValue /> 
      <Value /> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>268</ItemTypeId> 
      <ItemTypeDescription>Operator Code</ItemTypeDescription> 
      <Description>Operatore</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>201</FirstByteNumber> 
      <LastByteNumber>209</LastByteNumber> 
      <Visible>true</Visible> 
      <DefaultValue /> 
      <Value>0000000017</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>61</ItemTypeId> 
      <ItemTypeDescription>Quality Data</ItemTypeDescription> 
      <Description>Numero banco</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>210</FirstByteNumber> 
      <LastByteNumber>211</LastByteNumber> 
      <Visible>true</Visible> 
      <CharactTypeId>109</CharactTypeId> 
      <CharactTypeDescription>Numero banco</CharactTypeDescription> 
      <DefaultValue /> 
      <Value>03</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>61</ItemTypeId> 
      <ItemTypeDescription>Quality Data</ItemTypeDescription> 
      <Description>Valore di stabilizzazione tenuta acqua</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>212</FirstByteNumber> 
      <LastByteNumber>222</LastByteNumber> 
      <Visible>true</Visible> 
      <CharactTypeId>189</CharactTypeId> 
      <CharactTypeDescription>Valore di stabilizzazione tenuta acqua</CharactTypeDescription> 
      <DefaultValue /> 
      <Value>000558,1637</Value> 
      </ItemData>
    - <ItemData>
      <ItemTypeId>61</ItemTypeId> 
      <ItemTypeDescription>Quality Data</ItemTypeDescription> 
      <Description>Valore di prova tenuta acqua</Description> 
      <Format>ASCII</Format> 
      <FirstByteNumber>223</FirstByteNumber> 
      <LastByteNumber>233</LastByteNumber> 
      <Visible>true</Visible> 
      <CharactTypeId>150</CharactTypeId> 
      <CharactTypeDescription>Valore di prova tenuta acqua</CharactTypeDescription> 
      <DefaultValue /> 
      <Value>-00000,0171</Value> 
      </ItemData>
      </OpData>
      </ProcessOpDataSection>
      <TraceabilityDataSection /> 
      </PartTemplate>

  5. #5
    Phil_cattivocarattere ora è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,482
    Quote Originariamente inviato da Makino Visualizza il messaggio
    ...
    Ma nei vari <ItemData> non ci va.....
    Per forza che non ci va! Nel tuo codice cerchi
    codice:
    'seleziono il nodo da leggere
    Set Nodo = Obj.documentElement.selectNodes("ItemData/CharacterType")
    che non c'è nel file che hai postato.

  6. #6
    Makino non è in linea Novello
    Post
    32
    Scusa, errore di battitura....volevo scrivere in realtà questo:
    codice:
    Set Nodo = Obj.documentElement.selectNodes("ItemData/CharactTypeId")
    ...ma il COPIA/INCOLLA non ha funzionato.....

    Ma ho provato anche con "ItemData/CharactTypeDescription" e nn funziona ugualmente....
    Mentre invece se inserisco un item della prima parte tipo "Header/SerialNumber" la stringa corrispondente viene trovata.
    Per quello che in primis ho scritto che, essendo 15 i Capitoli identificati con "ItemData", magari la ricerca non era possibile.
    Grazie e scusa ancora per il disguido.......

  7. #7
    Phil_cattivocarattere ora è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,482
    Quote Originariamente inviato da Makino Visualizza il messaggio
    ....volevo scrivere in realtà questo:
    codice:
    Set Nodo = Obj.documentElement.selectNodes("ItemData/CharactTypeId")
    ...
    Ma ho provato anche con "ItemData/CharactTypeDescription" e nn funziona ugualmente....
    Uff, ho perso tutto quello che avevo scritto, quindi riparto ma con una edizione ridotta.
    Stringendo: il percorso che indichi non è quello corretto. La prima occorrenza di CharactTypeId è alla riga 132, CharactTypeDescription alla 133. Il suo percorso corretto nel file xml è "ProcessOpDataSection/OpData/ItemData/CharactTypeId" da indicare nella riga
    codice:
    Set Nodo = Obj.documentElement.selectNodes(...)
    Una volta fatto questo ti renderai conto che il resto non ha alcun senso, anzi darà errore perché cerchi attributi che non ci sono.
    Nell'ordine le cose da fare sono:
    1) tornare sugli articoli di Dragone Bianco per capire quello che è "nozione base" e cosa invece è spiegazione dell'esempio ("Capitolo" che più volte riporti in questo thread non è un membro di XML DOM, ma solo un nodo del file di esempio)
    2) mettere un punto di interruzione nel codice in corrispondenza della riga di cui sopra ed usare la finestra delle variabili locali per analizzare la struttura di Obj.documentElement (in particolare i ChildNodes)

    Una volta capito come ci si muove in un file xml, integrando quanto sopra con le informazioni che si trovano anche sul web sulla struttura XML DOM, potrai scrivere codice (giusto) che fa quello che veramente ti interessa.
    Suggerimento da esperienza personale: è molto utile indentare i file xml (non solo per la visualizzazione sul forum) perché questo ti permette di vedere anche con un editor di testo (non solo da programmi specifici per quel tipo di file) la struttura di nodi e sottonodi. In ambiente Microsoft c'è Xml Notepad 2007 da affiancare all'immancabile Notepad++.

  8. #8
    Makino non è in linea Novello
    Post
    32
    Grazie mille Phil!
    Ieri sera comunque avevo avuto anche io l'intuizione che mi hai confermato....gli ItemData che cercavo in realtá erano ancora sotto-annidati in altre strutture!!!
    Ho subito provato e la cosa è ovviamente corretta.
    Quindi posso dire di aver risolto il mio problema!!
    Grazie ancora.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi