Esempio:
sl è la tstringlist, quindi sl.text è l'intero file XML visto come una stringa.
datitrasmissione è una stringa, la funzione g_xml_prenditag() è quella sopra descritta [magari la posto]
datitrasmissione:=g_xml_prenditag(sl.text,'DatiTrasmissione');
datitrasmittente:=g_xml_prenditag(datitrasmissione,'IdTrasmittente');
Bene, ma sono pigro, non ho voglia certo di indicare ogni singolo tag (in realtà inizialmente stavo facendo un parser che creava il codice dal file XLS agenzia entrate. in pratica passava da Excel a codice pascal. poi mi son reso conto che nessuno me lo pagava, ed ho lasciato stare. comunque non è impossibile).
bene, siccome ci sono blocchi omogenei (sedi,anagrafiche etc), cosa meglio di funzioni del tipo
fillaidfiscale(datianagrafici,'terzo_datianagrafici_idfiscaleiva');
filladenominazione(datianagrafici,'terzo_datianagrafici_anagrafica');
Cosa sono? Banalmente l'uso di funzioni scritte bottom-UP
procedure filladenominazione(i_stringa:string;i_sezione:string);
begin
fillaQualcosa(i_stringa,'denominazione;nome;cognome;titolo;codeori',i_sezione);
end;
Questa è una funzione che prende, da una stringa, tanti bei tag (che sono indicati nell'elenco).
Il funzionamento è abbastanza banale, prima c'è una sorta di "explode" PHP (per trasformare la stringa dei parametri in un vettore di parametri).
E' molto triste, ma funziona su tutte le versioni di Delphi (senza comandi evoluti)
procedure fillaQualcosa(i_stringa:string;i_campi:string;i_sezione:string);
/// campi con ;
var
internos:string;
internolista:TStringList;
internoi:integer;
begin
{$ifndef debug}
if i_stringa='' then exit;
if i_sezione='' then exit;
if i_campi='' then exit;
{$endif}
internolista:=tstringlist.Create;
try
internolista.Delimiter := ';';
internolista.QuoteChar := #0;
g_SplitDelimitedText(i_campi, internolista);/// qui si fa una sorta di Explode PHP
for internoi:=0 to internolista.count-1 do
begin
internos:=g_xml_prenditag(i_stringa,internolista.strings[internoi]);
internos:=g_htmltoplain(internos);
aggiornaRecord(i_dataset,i_sezione+'_'+internolista.strings[internoi],internos);
end;
finally
internolista.Free;
end;
end;
Come si vede c'è il mitico prenditag, una funzione per togliere la mondezza html, ed infine una funzione che scrive nel dataset (database) un certo campo, con un certo valore.