Newsgroup: it.comp.appl.access
Titolo: fattura elettronica importazione e lettura tag

devo aprire un file xml e scorrerlo fino in fondo fin qui non dovrei avere problemi, come riconosco le varie righe o meglio i tag per poi importarli nel campo corretto della mia tabella fatture fornitori?
 
devo usare instr?
 
grazie.


Se lo leggi con il componente DOM non puoi sbagliare... è gerarchico.
Se lo apri come File di testo non ne uscirai mai...
 
@Alex


https://analystcave.com/vba-xml-working-xml-files/
 
 
ciao
 
---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
 
 

 grazie.
 
 
Ci sono vari modi, ma il più comodo si basa su una semplice routine di lettura Tag, dopo aver caricato il file xml in variabile stringa:
 
 
'Legge la stringa inclusa tra <NomeTag> ........ <NomeTag>
Public Function LeggeTagXml(ByRef Inizio As Long, ByVal Xml As String, ByVal nomeTag As String) As String
 
  Dim Pos As Long, PosF As Long
 
  Pos = InStr(Inizio, LCase(Xml), LCase("<" & nomeTag & ">"))
 
  If Pos > 0 Then
 
         PosF = InStr(Pos + Len(nomeTag), LCase(Xml), LCase("</" & nomeTag & ">"))
 
         If PosF > 0 Then
               LeggeTagXml = Mid(Xml, Pos + Len("<" & nomeTag & ">"), PosF - Pos - Len("<" & nomeTag & ">"))
               Inizio = PosF
         End If
 
  End If
 
End Function
 
 
 
(gli LCase non sono strettamente necessari).
Ad esempio (previo dimensionamento variabili):
 
 
'Legge contenuto File .xml 
   idx = FreeFile
 
   Open PathFtXml For Input As idx
 
   fContent = vbNullString
 
   Do While Not EOF(idx)
          Input #idx, str
          'Memorizza in stringa fContent, privata di RITORNO A CAPO, l'intero contenuto del File XML
          fContent = fContent & " " & str
   Loop
 
   Close #idx
 
 
xmlFatturaElettronicaBody = LeggeTagXml(1, fContent, "FatturaElettronicaBody")
 
 xmlDatiBeniServizi = LeggeTagXml(1, xmlFatturaElettronicaBody, "DatiBeniServizi")
 
 
 
'Legge Righe FT xml e trasferisce in Tabella
 
Set Rst = DB.OpenRecordset("Tmp_XMLRighe", dbOpenDynaset, dbAppendOnly)
 
   Pos = 1
   xmlDettaglioLinee = LeggeTagXml(Pos, xmlDatiBeniServizi, "DettaglioLinee")
 
   While xmlDettaglioLinee <> vbNullString
 
           Rst.AddNew
 
           'Il Tipo cessione Prestazione, opzionale, identifica Righe relative a Spese e Abbuoni
           xmlTipoCessionePrestazione = LeggeTagXml(1, xmlDettaglioLinee, "TipoCessionePrestazione")
 
           If xmlTipoCessionePrestazione <> vbNullString Then
                  Rst!TipoCP = xmlTipoCessionePrestazione
           End If
 
           Rst!Descrizione = Left(LeggeTagXml(1, xmlDettaglioLinee, "Descrizione"), 255)
           Rst!ImportoRiga = CnvXMLCurrency(LeggeTagXml(1, xmlDettaglioLinee, "PrezzoTotale"))
           Rst!Aliquota = CnvXMLSingle(LeggeTagXml(1, xmlDettaglioLinee, "AliquotaIVA"))
 
           Rst.Update
 
           xmlDettaglioLinee = LeggeTagXml(Pos, xmlDatiBeniServizi, "DettaglioLinee")
 
   Wend
 
   Rst.Close
   Set Rst = Nothing
 

 Rst!Descrizione = Left(LeggeTagXml(1, xmlDettaglioLinee, "Descrizione"), 255)
 
 
come mai solo i primi 255 caratteri?
 
in generale per leggere il valore di un nodo mi pare molto più pratico 
usare MSXML2.DOMDocument
con un semplice
  xDoc.selectNodes("//FatturaElettronicaBody/....")
 
ho direttamente il valore del nodo/i che mi interessa'no leggere
 
ciao
BFS


 ho direttamente il valore del nodo/i che mi interessa'no leggere
 
 
Alla fine è la stessa cosa, ma non dipendo da componenti esterne.
 
Tuttavia, come dicevo, ci sono vari metodi e ognuno sceglie quello che gli pare più vantaggioso.
 
Saluti

 Alla fine è la stessa cosa, ma non dipendo da componenti esterne.
 
 
A mio parere e' un vantaggio importante
Sempre che la semplicita' utilizzo della tua routine sia equivalente 
alla funzionalita' offerta dalle librerie Maicro soft

 alla funzionalita' offerta dalle librerie Maicro soft
 
 
Beh, non è una "mia" routine ma un metodo di lettura assolutamente 'ordinario' per files xml.
Io preferisco utilizzarla così per ragioni prestazionali (stiamo parlando di vba), ma con pochissimo sforzo si può rendere identica, nella sintassi di lettura, rispetto alle librerie MS (che sotto, ovviamente utilizzano analogo metodo).
 
Saluti