Leggere una fattura xml firmata

  1. ‹ Older
  2. 5 months ago

    @SergioTamborini Non credo ma è ininfluente... con le funzioni xml di xojo puoi cercare il nodo DatiAnagrafici e ne leggi i contenuti... almeno se ho capito la tua domanda...

    Probabilmente sbaglio nel costrure la stringa per la query in XmlNodeList=xmlDoc.XQL

    come ho detto, alcuni nodi presentano dei tag modificati, e anche se riesco ad eliminare tutto
    il blocco della firma, se nella query scrivo:

    XmlNodeList=xmlDoc.XQL( "//FatturaElettronicaBody//DatiGenerali//DatiGeneraliDocumento//TipoDocumento/text()" )

    Non mi restituisce nulla in quanto i primi due tag ( modificati con l'inserimento dell'elemento xmlns=... ) sono:

    <FatturaElettronicaBody xmlns="">
      
    <DatiGenerali xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    cancellando la parte aggiunta ovvero facendo diventare i tag in questo modo:

    <FatturaElettronicaBody>
      <DatiGenerali>

    il relativo dato viene recuperato.

  3. Sergio T

    Feb 25 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)
    Edited 5 months ago

    @PaoloBoccolacci Probabilmente sbaglio nel costrure la stringa per la query in XmlNodeList=xmlDoc.XQL

    come ho detto, alcuni nodi presentano dei tag modificati, e anche se riesco ad eliminare tutto
    il blocco della firma, se nella query scrivo:

    XmlNodeList=xmlDoc.XQL( "//FatturaElettronicaBody//DatiGenerali//DatiGeneraliDocumento//TipoDocumento/text()" )

    Non mi restituisce nulla in quanto i primi due tag ( modificati con l'inserimento dell'elemento xmlns=... ) sono:

    <FatturaElettronicaBody xmlns="">
      
    <DatiGenerali xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    cancellando la parte aggiunta ovvero facendo diventare i tag in questo modo:

    <FatturaElettronicaBody>
      <DatiGenerali>

    il relativo dato viene recuperato.

    Nella mia ignoranza sto litigando parecchio su questa cosa... ammetto di essere, specialmente in ambito "xml", una capra... Io sto risolvendo così (oltre alle varie idee che trovi già in questo thread):

    • leggo la stringa dell'xml con un textinputstream
    • eseguo una serie di controlli per rendere utilizzabile l'xml, partendo da (il problema che hai segnalato tu)
    s=ReplaceAll(s," xmlns=""""","")

    - quindi, specialmente in caso di fatture firmate digitalmente, ho parecchio testo inutile sia prima che dopo i dati xml della stringa, e per trovare SOLO la stringa che mi interessa processare, eseguo qualcosa del genere

    inizio=InStrB(s,"<p:FatturaElettronica")-1
    fine=InStrB(s,"</p:FatturaElettronica>")+LenB("</p:FatturaElettronica>")
    
    if inizio<0 then
    inizio=InStrB(s,"<P:FatturaElettronica")-1
    fine=InStrB(s,"</P:FatturaElettronica>")+LenB("</P:FatturaElettronica>")
    end if
    
    if inizio<0 then
    inizio=InStrB(s,"<FatturaElettronica")-1
    fine=InStrB(s,"</FatturaElettronica>")+LenB("</FatturaElettronica>")
    end if
    
    if inizio<0 then
    '<ns3:FatturaElettronica
    inizio=InStrB(s,"<ns3:FatturaElettronica")-1
    fine=InStrB(s,"</ns3:FatturaElettronica>")+LenB("</ns3:FatturaElettronica>")
    end if
    
    if inizio<0 then
    '<ns2:FatturaElettronica - </ns2:FatturaElettronica>
    inizio=InStrB(s,"<ns2:FatturaElettronica")-1
    fine=InStrB(s,"</ns2:FatturaElettronica>")+LenB("</ns2:FatturaElettronica>")
    end if

    (sono le varianti che ho trovato fino ad ora)

    - quindi metto tutto nella stringa "s" da processare

    s=MidB(s,inizio,fine-inizio)
    s="<?xml version=""1.0"" encoding=""utf-8""?>"+s

    -e infine mando tutto al motore xml di xojo, in modo da poterlo lavorare

    XMLDoc.LoadXml(s)

    Come poi vado a processare la stringa, lo leggi qui sopra...

  4. Antonio R

    Feb 25 Pre-Release Testers, Xojo Pro Europe (Italy)

    In realtà, a parte il nodo iniziale, i name space all'interno non dovrebbero preoccuparvi (in quanto fuori dalla definizione del documento, a meno che non vogliate proprio questi campi non standard)
    Per cui caricate normalmente il documento (nella forma leggibile ovvero non base64) e partite sempre nelle ricerche dei valori dal documentElement (in questo modo può chiamarsi FatturaElettronica, o p:FatturaElettronica o ns2:FatturaElettronica o ns3:FatturaElettronica) voi andate nella parte interna della struttura.

    quindi qualcosa come:
    myXmlNodeList=xmlDoc.DocumentElement.XQL("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()" )

    A meno di situazioni particolari dovreste sempre trovare il risultato cercato

    due note:
    non è necessario dividere con // i rami, basta /
    Partendo da DocumentElement la stringa di ricerca non deve partire con /, basta il nome dell'elemento da cui partire.
    La sintassi proposta (// e // prima del primo nodo) ha significati diversi e in questo caso fuorvianti, meno efficienti e quindi per i vostri scopi inutili.

  5. @Antonio R In realtà, a parte il nodo iniziale, i name space all'interno non dovrebbero preoccuparvi (in quanto fuori dalla definizione del documento, a meno che non vogliate proprio questi campi non standard)
    Per cui caricate normalmente il documento (nella forma leggibile ovvero non base64) e partite sempre nelle ricerche dei valori dal documentElement (in questo modo può chiamarsi FatturaElettronica, o p:FatturaElettronica o ns2:FatturaElettronica o ns3:FatturaElettronica) voi andate nella parte interna della struttura.

    quindi qualcosa come:
    myXmlNodeList=xmlDoc.DocumentElement.XQL("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()" )

    A meno di situazioni particolari dovreste sempre trovare il risultato cercato

    due note:
    non è necessario dividere con // i rami, basta /
    Partendo da DocumentElement la stringa di ricerca non deve partire con /, basta il nome dell'elemento da cui partire.
    La sintassi proposta (// e // prima del primo nodo) ha significati diversi e in questo caso fuorvianti, meno efficienti e quindi per i vostri scopi inutili.

    Non è un problema di // o / ( nel mio caso ), le seguenti istruzioni:

    myXmlNodeList=xmlDoc.DocumentElement.XQL("/FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()" )
    
    myXmlNodeList=xmlDoc.DocumentElement.XQL("//FatturaElettronicaBody//DatiGenerali//DatiGeneraliDocumento//TipoDocumento//text()" )
    
    myXmlNodeList=xmlDoc.XQL("/FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()" )
    
    myXmlNodeList=xmlDoc..XQL("/FatturaElettronicaBody//DatiGenerali//DatiGeneraliDocumento//TipoDocumento//text()" )

    trovano l'elemento desiderato solo se i tag sono "puliti" ovvero se non sono stati modificati con l'attributo xmlns, esempio:

    <FatturaElettronicaBody xmlns="">
    
    <DatiGenerali xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  6. Antonio R

    Feb 26 Pre-Release Testers, Xojo Pro Europe (Italy)

    Ma hai provato con FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text(), senza il / all'inizio e partendo da documentElement?

    Gli attributi di namespace non inficiano la ricerca nell'albero a meno che tu non stia cercando un nodo di un namespace (p:FatturaElettronica ad esempio)
    visto che generalmente questo viene "modificato" solo a livello di nodo root nei nodi seguenti non dovresti aver problemi.

  7. Edited 5 months ago

    @Antonio R Ma hai provato con FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text(), senza il / all'inizio e partendo da documentElement?

    Gli attributi di namespace non inficiano la ricerca nell'albero a meno che tu non stia cercando un nodo di un namespace (p:FatturaElettronica ad esempio)
    visto che generalmente questo viene "modificato" solo a livello di nodo root nei nodi seguenti non dovresti aver problemi.

    Si, ho provato anche senza il / all'inizio, ma nulla.

    In pratica io ho una cartella con vari file: xml firmati, xml non firmati, file p7m, tutti tranne questo tipo di xml firmati ( XadES ) non vengono letti in quanto in alcuni tag ci sono inseriti i dati che indico di seguito, se cancello i dati inseriti, i file si leggono.

    Dati presenti ( xmlns=...... ) solo in alcuni tag :

    <FatturaElettronicaHeader xmlns="">
    
     <DatiAnagrafici xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    <Sede xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    <IscrizioneREA xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    <FatturaElettronicaBody xmlns="">
    
    .....   

    ed altri tag, ma non tutti.

  8. @PaoloBoccolacci In pratica io ho una cartella con vari file: xml firmati, xml non firmati, file p7m, tutti tranne questo tipo di xml firmati ( XadES ) non vengono letti in quanto in alcuni tag ci sono inseriti i dati che indico di seguito, se cancello i dati inseriti, i file si leggono.

    Ho scritto male, i file nella cartella vengono tutti letti correttamente tranne i file xml firmati in XadES che presentanto alcuni tag modificati con l'aggiunta dell'elemento xmlns=...

  9. Antonio R

    Feb 27 Pre-Release Testers, Xojo Pro Europe (Italy)

    Nel caso di Paolo (ovvero xmlns="") bisogna usare:
    myXmlNodeList=xmlDoc.DocumentElement.XQL("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()", array("", ""))

  10. @Antonio R Nel caso di Paolo (ovvero xmlns="") bisogna usare:
    myXmlNodeList=xmlDoc.DocumentElement.XQL("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento/text()", array("", ""))

    Mitico Antonio !!! Grazie.

    A questo punto l'ideale è fare una procedura che vada bene per tutte le casistiche, oppure, come fa Sergio, prendere il file, "ripulirlo" e processarlo.

    Suggerimenti ?

  11. Antonio R

    Feb 27 Pre-Release Testers, Xojo Pro Europe (Italy)

    Basta fare una variante delle funzione che avevo proposto per leggere direttamente il valore di un nodo.
    si può fare anche automatica vedendo se esiste un attributo xmlns e leggendone il valore e creando l'array di conseguenza.

  12. Sergio T

    Mar 7 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)
    Edited 5 months ago

    Mi capitano ancora cose strane, in circa il 2% dei casi, però ho alcune letture di fatture xml che falliscono. Ecco tre screen emblematici:
    -image-
    -image-
    -image-

    Secondo voi come posso ovviare, sapendo che quando vado a leggere la stringa dell'xml converto la codifica a utf8

    t=TextInputStream.Open(xmlFile)
    s=t.ReadAll(Encodings.UTF8)
    s=ReplaceLineEndings(s,EndOfLine.Windows)
    s=ReplaceAll(s," xmlns=""""","")

    (l'ultima riga può essere di aiuto per quello che dicevano @Antonio R e @PaoloBoccolacci )

    Certo è che questa cosa della lettura delle fatture xml è più complicata del previsto per via di alcuni software di generazione che (a mio avviso) non rispettano al 100% lo standard della fattura...

  13. Antonio R

    Mar 7 Pre-Release Testers, Xojo Pro Europe (Italy)

    @SergioTamborini Certo è che questa cosa della lettura delle fatture xml è più complicata del previsto per via di alcuni software di generazione che (a mio avviso) non rispettano al 100% lo standard della fattura...

    Verissimo
    Ma questo vale anche per gli stessi strumenti della AE che danno risultati diversi…

  14. 2 weeks ago

    Christian S

    Jul 10 Pre-Release Testers, Xojo Pro, XDC Speakers Germany

    Next MBS Xojo Encryption Plugin will have a function for this:

    method PKCS7SignedData (DataP7M as String) as String

  15. Sergio T

    Jul 11 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)

    @ChristianSchmitz Next MBS Xojo Encryption Plugin will have a function for this:

    method PKCS7SignedData (DataP7M as String) as String

    I will try it immediately as it becomes available

  16. Christian S

    Jul 11 Pre-Release Testers, Xojo Pro, XDC Speakers Germany

    Here you go:

    https://www.dropbox.com/sh/63panq839cy88zj/AAAnCOR4WRNqf4DB1ezYo8t7a?dl=0

    Let me know wether it works.

  17. Christian S

    Jul 11 Pre-Release Testers, Xojo Pro, XDC Speakers Germany
    Edited 2 weeks ago

    And now good night!

  18. Sergio T

    Jul 11 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)

    @ChristianSchmitz Here you go:

    https://www.dropbox.com/sh/63panq839cy88zj/AAAnCOR4WRNqf4DB1ezYo8t7a?dl=0

    Let me know wether it works.

    Good morning... I'll try it in few minutes.

  19. last week

    Sergio T

    Jul 11 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)

    @ChristianSchmitz Here you go:

    https://www.dropbox.com/sh/63panq839cy88zj/AAAnCOR4WRNqf4DB1ezYo8t7a?dl=0

    Let me know wether it works.

    I think it's good. It works exactly as openssl as suggested, with the advantage we don't have to install its support under windows.

    Anyway I have a small number of signed xml that returns S/MIME error (openssl) or empty string (your plugin, I think for the same reason).

    If you want I can send you in private an example file.

  20. Antonio R

    Jul 11 Pre-Release Testers, Xojo Pro Europe (Italy)

    Sergio, puoi mandarmi anche a me gli esempi di file che non funzionano?

  21. Sergio T

    Jul 12 Pre-Release Testers, Xojo Pro Europe (Italy, Brescia)
    Edited last week

    @Antonio R Sergio, puoi mandarmi anche a me gli esempi di file che non funzionano?

    Mandato il link in una conversazione privata per ragioni di riservatezza dei documenti.

or Sign Up to reply!