Estrazione XML da Fattura Elettronica

di il
13 risposte

Estrazione XML da Fattura Elettronica

Ciao,

sembra quasi un portafortuna ma a differenza degli altri casi dove trovavo qualcosa, ma niente di approfondito in questo caso non trovo niente.
come estraggo il pdf da un file xml di una fattura elettronica? :O

non ne ho la più pallida idea.

13 Risposte

  • Re: Estrazione XML da Fattura Elettronica

    Salve,
    selezioni il nodo xml desiderato, ne carichi il contenuto in una variabile stringa, lo riconverti da base64 (System.Convert.FromBase64String(buf)), poi lo salvi su file o ne fai quello che desideri...
    saluti omnia
    --
    Andrea
  • Re: Estrazione XML da Fattura Elettronica

    I file (al plurale). Poi devi correggere gli errori, altrimenti non decidifichi bene.
    o usi Programmelli appositi
  • Re: Estrazione XML da Fattura Elettronica

    C'è però sempre un punto, ho visto che sia utilizzando fatturar elettronica body, nel grandissimo sistema di nicola iarocci, non riesco a tirare fuori in nessuno dei due casi il nome dell'allegato.
    NB, prelevo sempre tutto le altre info, tranne quella.

            nomefor = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione
            iva = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA.IdCodice
            Dim invnumber, importo, data, attch
            For Each doc In fattura.FatturaElettronicaBody
                Dim datidocumento = doc.DatiGenerali.DatiGeneraliDocumento
                invnumber = datidocumento.Numero
                importo = datidocumento.ImportoTotaleDocumento
                data = datidocumento.Data
    
            Next
    fregandosene del fatturaelettronicabodyallegati.
    mentre se uso l'altro sistema fatturaelettronica.common.allegati non riesco ad associarlo a stringa.

    utilizzando questa classe
    https://fatturaelettronicaopensource.org/docs/api/FatturaElettronica.Common.Allegati.html
  • Re: Estrazione XML da Fattura Elettronica

    Giusto per rendere più semplice la contestualizzazione del concetto, vi posto la riga di codice.
    'errore che ora becco nella stesura è un errore ad una certa riga nella lettura dell allegato.readxml
    tipo questa
    ''None' is an invalid XmlNodeType. Line 2, position 3538.'
    o anche questa
    System.Xml.XmlException: ''None' is an invalid XmlNodeType. Line 1147, position 1
    ovviamente la parte di codice dove invece vado a leggere iva, nomefornitore, etc etc funziona da dio.
    Dim fattura As New FatturaOrdinaria()
            Dim allegato As New Allegati()
            fattura = FatturaOrdinaria.CreateInstance(Instance.Privati)
            Dim readerSettings = New XmlReaderSettings With {
            .IgnoreWhitespace = True,
            .IgnoreComments = True,
            .IgnoreProcessingInstructions = True
        }
            Using r = XmlReader.Create(pathexplorer, readerSettings)
                fattura.ReadXml(r)
                allegato.ReadXml(r)
            End Using
            Dim nomefor, iva, progressivo
            nomefor = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione
            iva = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA.IdCodice
            Dim invnumber, importo, data, attch
            For Each doc In fattura.FatturaElettronicaBody
                Dim datidocumento = doc.DatiGenerali.DatiGeneraliDocumento
                invnumber = datidocumento.Numero
                importo = datidocumento.ImportoTotaleDocumento
                data = datidocumento.Data
    
            Next
            Dim nomeattch, formatt, attach
            nomeattch = allegato.NomeAttachment
            formatt = allegato.FormatoAttachment
            attach = allegato.Attachment
    
            Dim byt As Byte() = Convert.FromBase64String(attach)
            Dim newfile = System.Text.Encoding.UTF8.GetString(byt)
            MsgBox(newfile)
  • Re: Estrazione XML da Fattura Elettronica

    Salve,
    brutalmente, selezioni il nodo desiderato e lo gestisci... di seguito un esempio triviale, che cicla tutti i nodi di allegato
    Module Module1
    
        Sub Main()
    
            Dim xmlData As String = "" '= contenuto del file XML
            Dim doc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
            Try
                doc.LoadXml(xmlData)
    
                For Each node As System.Xml.XmlNode In doc.SelectNodes(String.Format(".//{0}", "Allegati"))
                    Dim fileName As String = GetElementFromNode("NomeAttachment", node)
                    If Not String.IsNullOrEmpty(fileName) Then
                        Dim fileContent As String = GetElementFromNode("Attachment", node)
                        If Not String.IsNullOrEmpty(fileContent) Then
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("AlgoritmoCompressione", node)))
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("DescrizioneAttachment", node)))
    
                            'contenuto del file
                            Dim b() As Byte = Convert.FromBase64String(fileContent)
                            'salva su file??
                            '...
                        End If
                    End If
                Next
            Catch ex As Exception
                '...
            End Try
    
        End Sub
    
        Private Function GetElementFromNode(ByVal Key As String, ByVal node As System.Xml.XmlNode) As String
    
            Dim buf As String = ""
            If Not node Is Nothing Then
                Dim ElemNode As System.Xml.XmlNode = node.SelectSingleNode(String.Format(".//{0}", Key))
                If Not ElemNode Is Nothing Then buf = ElemNode.InnerText.Trim
            End If
            Return buf
    
        End Function
    
    End Module
    
    saluti omnia
    --
    Andrea
  • Re: Estrazione XML da Fattura Elettronica

    asql ha scritto:


    Salve,
    brutalmente, selezioni il nodo desiderato e lo gestisci... di seguito un esempio triviale, che cicla tutti i nodi di allegato
    Module Module1
    
        Sub Main()
    
            Dim xmlData As String = "" '= contenuto del file XML
            Dim doc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
            Try
                doc.LoadXml(xmlData)
    
                For Each node As System.Xml.XmlNode In doc.SelectNodes(String.Format(".//{0}", "Allegati"))
                    Dim fileName As String = GetElementFromNode("NomeAttachment", node)
                    If Not String.IsNullOrEmpty(fileName) Then
                        Dim fileContent As String = GetElementFromNode("Attachment", node)
                        If Not String.IsNullOrEmpty(fileContent) Then
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("AlgoritmoCompressione", node)))
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("DescrizioneAttachment", node)))
    
                            'contenuto del file
                            Dim b() As Byte = Convert.FromBase64String(fileContent)
                            'salva su file??
                            '...
                        End If
                    End If
                Next
            Catch ex As Exception
                '...
            End Try
    
        End Sub
    
        Private Function GetElementFromNode(ByVal Key As String, ByVal node As System.Xml.XmlNode) As String
    
            Dim buf As String = ""
            If Not node Is Nothing Then
                Dim ElemNode As System.Xml.XmlNode = node.SelectSingleNode(String.Format(".//{0}", Key))
                If Not ElemNode Is Nothing Then buf = ElemNode.InnerText.Trim
            End If
            Return buf
    
        End Function
    
    End Module
    
    saluti omnia
    --
    Andrea
    Interessante, però rimango fermo in un punto dicendo che mi da invalido 1,1 il file xml.

    quando scrivi Dim xmlData As String = pathexplorer '= contenuto del file XML intendi il file xml stesso, il perrcorso?
  • Re: Estrazione XML da Fattura Elettronica

    Salve,
    no, in
    dim xmlData as string = ""
    intendo che devi leggere il contenuto del file a te interessante e valorizzare la variabile xmlData con il suo contenuto testuale... poi carichi il DOM xml tramite doc.LoadXml(xmlData)
    il blocco Try/catch NON e' simbolico in quanto, a prescindere che tu abbia verificato che si tratti di un file fattura, potrebbe essere "non completamente a posto" e mandare in eccezione il parser che carica il DOM...

    se ti da file non valido, prova a verificarlo anche online... in questo forum hanno recentemente postato il link a https://www.xmlvalidation.com... prova a vedere li'...
    saluti omnia
    --
    Andrea
  • Re: Estrazione XML da Fattura Elettronica

    Ciao,

    inanzi tutto grazie mille per i tuoi continui feedback,
    ho verificato il caricamento del xml, ma come quasi il 90% delle fatture elettroniche osno piene di errori.
    Ora, io sto verificando le fatture sia di utenze ache fatture di fornitori normlai attraverso quel link.

    Non vorrei ribattere il chiodo ma onestamente, credo che la classe di lettura, che avevo postato qua, sia la più corretta.
    solamente che in questo caso specifico non riesco a lavorarci sopra, a causa della mia inesperienza.

    https://fatturaelettronicaopensource.org/docs/api/FatturaElettronica.Common.Allegati.html

    Timer86 ha scritto:


    Giusto per rendere più semplice la contestualizzazione del concetto, vi posto la riga di codice.
    'errore che ora becco nella stesura è un errore ad una certa riga nella lettura dell allegato.readxml
    tipo questa
    ''None' is an invalid XmlNodeType. Line 2, position 3538.'
    o anche questa
    System.Xml.XmlException: ''None' is an invalid XmlNodeType. Line 1147, position 1
    ovviamente la parte di codice dove invece vado a leggere iva, nomefornitore, etc etc funziona da dio.
    CODICE: SELEZIONA TUTTO

    Dim fattura As New FatturaOrdinaria()
    Dim allegato As New Allegati()
    fattura = FatturaOrdinaria.CreateInstance(Instance.Privati)
    Dim readerSettings = New XmlReaderSettings With {
    .IgnoreWhitespace = True,
    .IgnoreComments = True,
    .IgnoreProcessingInstructions = True
    }
    Using r = XmlReader.Create(pathexplorer, readerSettings)
    fattura.ReadXml(r)
    allegato.ReadXml(r)
    End Using
    Dim nomefor, iva, progressivo
    nomefor = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione
    iva = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA.IdCodice
    Dim invnumber, importo, data, attch
    For Each doc In fattura.FatturaElettronicaBody
    Dim datidocumento = doc.DatiGenerali.DatiGeneraliDocumento
    invnumber = datidocumento.Numero
    importo = datidocumento.ImportoTotaleDocumento
    data = datidocumento.Data

    Next
    Dim nomeattch, formatt, attach
    nomeattch = allegato.NomeAttachment
    formatt = allegato.FormatoAttachment
    attach = allegato.Attachment

    Dim byt As Byte() = Convert.FromBase64String(attach)
    Dim newfile = System.Text.Encoding.UTF8.GetString(byt)
    MsgBox(newfile)
    Re: Estrazione XML da Fattura ElettronicaCita Timer86
    da Timer86 » 03 lug 2019, 11:37

    C'è però sempre un punto, ho visto che sia utilizzando fatturar elettronica body, nel grandissimo sistema di nicola iarocci, non riesco a tirare fuori in nessuno dei due casi il nome dell'allegato.
    NB, prelevo sempre tutto le altre info, tranne quella.

    CODICE: SELEZIONA TUTTO

    nomefor = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione
    iva = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA.IdCodice
    Dim invnumber, importo, data, attch
    For Each doc In fattura.FatturaElettronicaBody
    Dim datidocumento = doc.DatiGenerali.DatiGeneraliDocumento
    invnumber = datidocumento.Numero
    importo = datidocumento.ImportoTotaleDocumento
    data = datidocumento.Data

    Next
    fregandosene del fatturaelettronicabodyallegati.
    mentre se uso l'altro sistema fatturaelettronica.common.allegati non riesco ad associarlo a stringa.

    utilizzando questa classe
    https://fatturaelettronicaopensource.o ... egati.html
  • Re: Estrazione XML da Fattura Elettronica

    asql ha scritto:


    Salve,
    no, in
    dim xmlData as string = ""
    intendo che devi leggere il contenuto del file a te interessante e valorizzare la variabile xmlData con il suo contenuto testuale... poi carichi il DOM xml tramite doc.LoadXml(xmlData)
    il blocco Try/catch NON e' simbolico in quanto, a prescindere che tu abbia verificato che si tratti di un file fattura, potrebbe essere "non completamente a posto" e mandare in eccezione il parser che carica il DOM...

    se ti da file non valido, prova a verificarlo anche online... in questo forum hanno recentemente postato il link a https://www.xmlvalidation.com... prova a vedere li'...
    saluti omnia
    --
    Andrea
    Stavo però riflettendo, al tuo sistema.
    dunque tu intendi che nella stringa devo riportare la tabella della fattura elettronica.

    esempio
    <family>
    <name gender="Male">
    <firstname>Tom</firstname>
    <lastname>Smith</lastname>
    </name>
    <name gender="Female">
    <firstname>Dale</firstname>
    <lastname>Smith</lastname>
    </name>
    </family>

    ma la cosa che mi destabilizza, è che così è hardcoded, come faccio a dargli un xmldata programmatico. La fattura non è sempre la stessa e cambia,
  • Re: Estrazione XML da Fattura Elettronica

    Salve,
    non ho capito molto bene... di hard-coded ci sono solo i nomi degli attributi nodo per i quali devi fare la ricerca xpath... il resto e' "tutto variabile", ovviamente..
    la fattura sicuramente non sara' sempre la stessa, ma quando tu vai a leggerla, ne leggi tutto il contenuto e lo carichi in "xmlData"... poi provi a registrarne il DOM con Doc.LoadXml(xmlData)... a questo punto e' pero' ovvio che quel xml possa esserci qualsiasi cosa, anche lo snippet che hai messo tu sopra... ma nel caso specifico, la ricerca xpath per i nodi Allegato non saranno riscontrati, e non potrai estrarre nulla...
    se invece e' veramente una fattura elettronica, la struttura e' sicuramente (piu' o meno) sempre la stessa, ma anche qui i nodi degli allegati potrebbero essere valorizzati/presenti, come anche no... e se la ricerca xpath non li trova, comunque non devi fare nulla...
    ripeto, sicuramente non ho compreso cosa intendevi...
    saluti omnia
    --
    Andrea
  • Re: Estrazione XML da Fattura Elettronica

    asql ha scritto:


    Salve,
    non ho capito molto bene... di hard-coded ci sono solo i nomi degli attributi nodo per i quali devi fare la ricerca xpath... il resto e' "tutto variabile", ovviamente..
    la fattura sicuramente non sara' sempre la stessa, ma quando tu vai a leggerla, ne leggi tutto il contenuto e lo carichi in "xmlData"... poi provi a registrarne il DOM con Doc.LoadXml(xmlData)... a questo punto e' pero' ovvio che quel xml possa esserci qualsiasi cosa, anche lo snippet che hai messo tu sopra... ma nel caso specifico, la ricerca xpath per i nodi Allegato non saranno riscontrati, e non potrai estrarre nulla...
    se invece e' veramente una fattura elettronica, la struttura e' sicuramente (piu' o meno) sempre la stessa, ma anche qui i nodi degli allegati potrebbero essere valorizzati/presenti, come anche no... e se la ricerca xpath non li trova, comunque non devi fare nulla...
    ripeto, sicuramente non ho compreso cosa intendevi...
    saluti omnia
    --
    Andrea
    Ciao Andrea,
    ho poi usato il tuo metodo non avevo risposto perchè ero fuori, in realtà il tuo metodo mi funziona sempre, salvo che in alcune fatture mi esce spesso l'errore:
    Invalid Lenght for a Base-64 char array or string.
            doc1.Load(xmlData)
                Dim xmlcontents As String = doc1.InnerXml
                For Each node As System.Xml.XmlNode In doc1.SelectNodes(String.Format(".//{0}", "Allegati"))
                    Dim fileName As String = GetElementFromNode("NomeAttachment", node)
                    If Not String.IsNullOrEmpty(fileName) Then
                        Dim fileContent As String = GetElementFromNode("Attachment", node)
                        If Not String.IsNullOrEmpty(fileContent) Then
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("AlgoritmoCompressione", node)))
                            Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("DescrizioneAttachment", node)))
                            'contenuto del file
                            Dim b() As Byte = Convert.FromBase64String(fileContent)
                            If Not File.Exists("C:\FATEL\Attachment\" & sedest & ".pdf") Then
                                File.WriteAllBytes("C:\FATEL\Attachment\" & sedest & ".pdf", b)
                                Button4.Visible = True
                            Else
                                File.Delete("C:\FATEL\Attachment\" & sedest & ".pdf")
                                File.WriteAllBytes("C:\FATEL\Attachment\" & sedest & ".pdf", b)
                                Button4.Visible = True
                            End If
                        Else
                            Button4.Visible = False
                            '...
                        End If
                    End If
                Next
  • Re: Estrazione XML da Fattura Elettronica

    Salve,
    giusto una cosa nel tuo codice...
    > Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("AlgoritmoCompressione", node)))
    > Debug.WriteLine(Convert.FromBase64String(GetElementFromNode("DescrizioneAttachment", node)))

    questi non vanno convertiti da base64...

    poi, relativamente alla generazione del file... tu hai imposto che l'allegato sia un pdf... teoricamente puo' essere anche un jpg, un xls, ....
    visto che leggi gli attributi di cui sopra, leggi almeno anche l'attributo "Formato", che potrebbe indicarti, se valorizzato, che tipo di file sia, e magari utilizzarlo per la corretta estensione del file... ricorda pero' che ho visto molte fatture (e sicuramente anche tu) che non valorizzano tale attributo, quindi e' obiettivamente difficile farne un requisito vincolante... stiamo dando prova di essere dei beceri superficiali in questo ambito, al di la' delle specifiche ADE sindacabili

    anche su come codifichiamo in base64... vedi ad esempio https://stackoverflow.com/questions/2925729/invalid-length-for-a-base-64-char-array
    saluti omnia
    --
    Andrea
  • Re: Estrazione XML da Fattura Elettronica

    Buonasera a tutti!
    Mi sono avvicinato da poco alla programmazione (circa un anno e mezzo) e sono un autodidatta.
    Vi scrivo, in merito all'XML: come posso importare in un datagridview i dati presenti in questo ciclo For? E come posso estrarre, importandoli sempre nel datagridview, tututti i campi "Descrizione prodotto" e "Prezzo unitario", sempre nel datagridview? Se uso il ciclo per "Descrizione" (prodotti) e Prezzo unitario, nel grid mi compare solo il primo o l'ultimo campo!
    Forse è per voi una domanda banale, ma non so dove sbatterci la testa.
    Mi dareste un enorme aiuto, sto preparando la tesi su questa roba!

    Grazie infinite a chi mi risponderà
            nomefor = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione
            iva = fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA.IdCodice
            Dim invnumber, importo, data, attch
            For Each doc In fattura.FatturaElettronicaBody
                Dim datidocumento = doc.DatiGenerali.DatiGeneraliDocumento
                invnumber = datidocumento.Numero
                importo = datidocumento.ImportoTotaleDocumento
                data = datidocumento.Data
    
            Next
Devi accedere o registrarti per scrivere nel forum
13 risposte