Newsgroup: it.comp.lang.delphi
Titolo: esportare  in xml

salve, 
ho il seguente problema:
Il mio database mysql ha due tabelle A e B.
Dovrei esportare in un unico file xml, secondo uno schema ben preciso che
ho in un file xsd, alcune colonne di A, e di B.
--- posted by geoForum on 
http://www.delphiedintorni.it

puoi farlo in molti modi...
-usando un file di testo dove generi le righe dei tag
-usando componenti di alto livello per gestire creazione di nodi, ecc.
Simo 

dimenticavo di dire che sono un novellino,
se puoi essere più specifico nella risposta, te ne sarei grato.


beh potresti prendere un TMemo
e usando Memo1.lines.add('<XML> .....');
puoi aggiungere righe dei tag e poi alla fine fai 
memo1.lines.savefile('pippo.xml');
Simo 

>beh potresti prendere un TMemo
Aaaaargh!!! :-) 
- TMemo è un componente visuale - se lo usi tanto per avere una 
stringlist usa quella direttamente!!!
- Ti tocca fare tutto a da te, e ovviamente non usa alcun parser XML per 
essere sicuri che il file sia valido. Qualsiasi errore non lo vedi 
finché non cerchi di validare il file.
La soluzione più comoda sarebbe l'XML Mapper, che ha il difetto di non 
funzionare proprio bene bene al 100% e non c'è in tutte le versione, 
però ti permette di mappare il tuo schema su una query e creare la 
trasformazione che ti serve. 
Altrimenti usa TXMLDocument, ti tocca fare tutto da codice, ma almeno 
lavori con un parser XML che ti dice se stai sbagliando qualcosa.



Ciao,
dove trovo il componente che hai nominato (TXMLDocument)?
NioBi


>beh potresti prendere un TMEMO>
non devi usasre alcun componente TMemo, che č visuale.
Piuttosto, č possibile scrivere direttamente in un file di testo:
  AssignFile(F, DirTel.Text+'\Ditta5_05_2007.XML');
  Rewrite(F);
  WriteLn(F, '<?xml version="1.0" encoding="ISO-8859-1"?>');
  WriteLn(F, #9+'<DenRetrMensili>');
  WriteLn(F, #9+#9+'<DatiMittente>');
  WriteLn(F, #9+#9+#9+'<CFPersona>'+CodFisc.Text+'</CFPersona>');
  WriteLn(F, #9+#9+#9+'<RagSoc>'+NomeCons.Text+'</RagSoc>');
  WriteLn(F, #9+#9+#9+'<CFMittente>'+CodFisc.Text+'</CFMittente>');
  WriteLn(F, #9+#9+#9+'<CFSoftware>'+CodFisc.Text+'</CFSoftware>');
  WriteLn(F, '</DatiMittente>');
e cosi' via, aggiungendo una indentazione per ogni campo incluso in 
quello precedente, come i nodi di TTreeView.
Infatti, se guardi un file Xml in formato testo, noterai le indentazioni 
che corrispondono ai campi.
Ovviamente, seguendo le specifiche tecniche richieste per i campi.
L'esempio č tratto da un file normalmente validato dall'Inps, quindi č 
funzionante.
NioBi


 dove trovo il componente che hai nominato (TXMLDocument)?
Avendo gia' affrontato lo stesso problema, io mi sono trovato bene con
TXMLDocument per via dell'approccio DOM che offre.
Se cerchi nell'help troverai ceh devi aggiungere la unit XMLDoc per quanto
riguarda il documento, invece se devi trattare i singoli nodi rivolgiti
all'interfaccia IXMLDocument, che si trova nella unit XMLIntf.
Se vuoi un demo su come utilizzarli, leggi qui:
http://delphi.about.com/od/internetintranet/ss/xml_rss_read.htm
Attento che se usi la versione 6 di delphi devi importare un package
specifico, 
http://cc.codegear.com/Item.aspx?id=18939
-- 
Morde

L'esempio è tratto da un file normalmente validato dall'Inps, quindi è 
L'INPS è un parser validante? 
Morale: benché sia possibile costruire un file XML "a mano" come da post 
precedente, è il modo migliore per farsi del male. Basta un piccolo 
errore (es. una maiuscola nel posto sbagliato, un tag chiuso male) e il 
documento XML non è valido. Meglio affidarsi ad un parser che (DOM o 
SAX, scegliete voi):
- crea il documento nel modo "corretto"
- segnala eventuali errori, magari validando direttamente con un DTD o 
uno schema.
- permette di manipolare il documento con facilità


grazie per l'aiuto, volevo aggiungere un esempio riportato sulla guida
delphi di Marco Cantů.
come esportare un dataset in XML
procedure DataSetToDOM (RootName, RecordName: string;
  XMLDoc: TXmlDocument; DataSet: TDataSet);
var
  iNode, iChild: IXMLNode;
  i: Integer;
begin
  DataSet.Open;
  DataSet.First;
  // root
  XMLDoc.DocumentElement := XMLDoc.CreateNode (RootName);
  // add table data
  while not DataSet.EOF do
  begin
    // add a node for each record
    iNode := XMLDoc.DocumentElement.AddChild (RecordName);
    for I := 0 to DataSet.FieldCount - 1 do
    begin
      // add an element for each field
      iChild := iNode.AddChild (DataSet.Fields[i].FieldName);
      iChild.Text := DataSet.Fields[i].AsString;
    end;
    DataSet.Next;
  end;
  DataSet.Close;
end;
