Forum >> Principianti >> Estrarre dati da fattura elettronica PA

Pagina: 1

Vorrei estrarre dati da un file xml, una fattura elettronica PA che é un file xml standard i cui tag sono fissi,credo di aver capito che la via migliore sia invocare etree ed acquisire l'intero albero; avendo l'esatta posizione sull'albero di ogni elemento in notazione xpath non riesco a capire come fare per assegnare alle variabili i valori presenti nel file, ho letto la documentazione di etree e credo di perdermi qualcosa perché non ne esco, sono neofita per cui può essere che che mi manchi un elemento che si da per scontato. Devo usare findall(percorso xpath) o cosa?
Anticipatente ringraziando.

Bruno Mikasa
Ciao caro, è sicuro che ti conviene usare una libreria apposita come xml, lxml o similari.

Visto che il funzionamento è banale, posta quello che hai fatto e vediamo dove sta l'intoppo.

Cya


--- Ultima modifica di Daniele aka Palmux in data 2015-08-17 12:20:08 ---
Daniele aka Palmux said @ 2015-08-17 12:18:41:
Ciao caro, è sicuro che ti conviene usare una libreria apposita come xml, lxml o similari.

Visto che il funzionamento è banale, posta quello che hai fatto e vediamo dove sta l'intoppo.

Cya


--- Ultima modifica di Daniele aka Palmux in data 2015-08-17 12:20:08 ---
senza variabili non ho niente su cui costruire, ho testato di poter estrarre l'xml, allego file con dettagli in nota e FEPA standard dacui trarre i riferimenti

sto cercando di imparare python in vacanza e credo che la soluzione migliore sia di applicarlo a problemi reali che potrebbero semplificarmi la vita al lavoro dove la possibilità di lavorare in tal senso non é prevista.

grazie

Mikasa
Allegati
Caro Mikasa, hai davvero l'imbarazzo della scelta per compiere un'operazione del genere, volendo di fatto estrarre semplicemente dei dati da un file XML.

Un mio collega che lavora un giorno sì e l'altro pure con quel formato, si è scocciato delle solite librerie come xml (che comunque nessuno ti vieta di utilizzare sia chiaro) e da un po' di tempo lo vedo spesso utilizzare xmltodict. Nel tuo caso ridurresti tutto a poche righe di codice.

Mettiamo tu voglia prelevare dal documento l'IdPaese:
import xmltodict

with open('/path/to/file/IT01234567890_11001.xml') as fd:
    obj = xmltodict.parse(fd.read())

paese = obj['p:FatturaElettronica']['FatturaElettronicaHeader']['DatiTrasmissione']['IdTrasmittente']['IdPaese']
print paese
Otterrai come risultato: IT

Un altra libreria che mi piace molto è untangle, che permette anche qui con estrema facilità di ottenere un risultato analogo:
import untangle

obj = untangle.parse('/path/to/file/IT01234567890_11001.xml')
paese = obj.p_FatturaElettronica.FatturaElettronicaHeader.DatiTrasmissione.IdTrasmittente.IdPaese.cdata
print paese
Anche qui un bel IT come risposta.

Se poi vuoi restare sul solito e conosciuto, con la libreria xml ottieni lo stesso risultato:
import xml.etree.cElementTree as ET

obj = ET.ElementTree(file='/path/to/file/IT01234567890_11001.xml')
for elem in obj.iterfind('FatturaElettronicaHeader/DatiTrasmissione/IdTrasmittente/IdPaese'):
    print elem.text
Indovina un po', ancora un bell'IT come risposta.

Insomma caro mio, libera la fantasia.

Ciao.
Daniele

P.S. Visto che il sito con il CamelCase fa un po' come cazzo vuole, ti ho copiato i tre esempi anche su PasteBIN.
Ciao
Io ho usato xmltodict ed ha funzionato perfettamente:

print('-- fattura xml example --')
fattura_xml_file = os.path.join(base_path, 'IT0999999 00B99.xml')
tree = et.parse(fattura_xml_file)
root = tree.getroot()

Denominazione = [Denominazione.text for Denominazione in root.iter('Denominazione')]
NumeroLinea = [NumeroLinea.text for NumeroLinea in root.iter('NumeroLinea')]
data = [Denominazione, NumeroLinea]

df = pd.DataFrame(data).T
print(df)

--- Ultima modifica di janas in data 2019-06-18 22:43:06 ---

--- Ultima modifica di janas in data 2019-06-18 22:43:29 ---
Ciao,



io ho usato iterfind, però , nasce un problema. Se il campo datascadenza di pagamento non esiste, pensavo che mi rendesse un campo scadenza.text vuto, e dunque potessi procedere alla ricerca del campo successivo, invece sembra di no. non mi da errore, semplicemente non va al ciclo if successivo se scadenza.text è vuoto.

for scadenza in obj.iterfind('FatturaElettronicaBody/DatiPagamento/DettaglioPagamento/DataScadenzaPagamento'):

                            print(scadenza.text) #print thee expiration date

                

                            if (not scadenza.text):

                                for scadenza1 in obj.iterfind('FatturaElettronicaBody/DatiPagamento/DettaglioPagamento/GiorniTerminiPagamento'):

                                    from datetime import timedelta, date

                                    d1 = datem + timedelta(days=int(scadenza1.text))

                                    print(f'New Expire {d1}')

                                    scadenza.text = d1




Pagina: 1



Esegui il login per scrivere una risposta.