Soubory XML, vytvoření, načtení, rozbor

Top  Previous  Next

Seznam témat:

řešení

 

Řešení

Vytvoření souboru XML se dvěma elementy na druhé úrovni

var

 Xml: TXMLDocument;

 Item: TXMLItem;

begin

 Xml := TXMLDocument.Create('xml', 'version="1.0" encoding="windows-1250"');

 try

   Item := Xml.AddChild('MESSAGE');

 

   with Item.AddChild('ARTICLE') do begin

     Attribute['ID'] := 'A12465';

     Text := 'Savo Extra 500ml';

   end;

 

   with Item.AddChild('ARTICLE') do begin

     Attribute['ID'] := 'A96133';

     Text := 'Rukavice gumové';

   end;

 

   Xml.SaveToFile('c:\demo1.xml');

 finally

   Xml.Free;

 end;

 ShowMessage('Done.');

end.

 

Načtení souboru XML, modifikace, uložení

var

 Xml: TXMLDocument;

 Item: TXMLItem;

begin

 Xml := TXMLDocument.Create('xml', 'version="1.0" encoding="windows-1250"');

 try

   Xml.LoadFromFile('c:\demo1.xml');

   Item := Xml.FindChild('MESSAGE');

   Item := Item.GetFirstChild;

 

   //projdi všechny uzly "ARTICLE" a pro každý...

   while Item <> nil do begin

 

     //...přidej atribut "SKLADEM"

     Item.Attribute['SKLADEM'] := 'ANO';

 

     //...přidej poduzel "SKLAD"

     with Item.AddChild('SKLAD') do

       Text := 'S001';

   

     //posun na další uzel stejné úrovně

     Item := Item.GetNextSibling;

   end;

   

   Xml.SaveToFile('c:\demo2.xml');

 finally

   Xml.Free;

 end;

end.

 

Export skladových položek do XML

Příklad ukazuje reálný export skladových položek a přiřazených kategorií do XML.

 

var

 Xml: TXMLDocument;

 DocItem,RowItem,CatItem: TXMLItem;

 QryMater: TQuery;

 QryCateg: TQuery;

 Progress: TProgress;

 I: integer;

begin

 Progress := TProgress.CreateSimple('Export',

   'Probíhá export skladových položek. Prosím, čekejte...');

 try

   Xml := TXMLDocument.Create('xml', 'version="1.0" encoding="windows-1250"');

   try

     QryMater := TQuery.Create(nil);

     QryCateg := TQuery.Create(nil);

     try

       //dotaz pro select ze skl. položek (omater)

       QryMater.DatabaseName := DefaultDatabaseName;

       QryMater.SQL.Add('SELECT id_material, nazev, mj_id,mjvydej_id,');

       QryMater.SQL.Add('obvcena, obvcenasdph, typmat, druh_id, skp,');

       QryMater.SQL.Add('spdan, dph, mena_id, prcena, prcenasdph,');

       QryMater.SQL.Add('marze, rabat, skupina_id, spdan, spdankod');

       QryMater.SQL.Add('FROM dba.omater');

       QryMater.Open;

   

       //dotaz pro select z kategorií (omkateg) a přiřaz. tabulky (gfpriraz)

       QryCateg.DatabaseName := DefaultDatabaseName;

       QryCateg.SQL.Add('SELECT k.id_kat, k.popis');

       QryCateg.SQL.Add('FROM dba.ompriraz p, dba.omkateg k');

       QryCateg.SQL.Add('WHERE p.kat_id=k.id_kat and');

       QryCateg.SQL.Add(' p.material_id = :id_material');

       QryCateg.Prepare; //Prepare je efektivní v případech, kdy se stejný

                         //SQL opakovaně otevírá jen s obměnou parametrů

 

       DocItem := Xml.AddChild('OMATER');

       while not QryMater.Eof do begin

         RowItem := DocItem.AddChild('ROW');

 

         //export sloupců z QryMater

         for I := 0 to QryMater.FieldCount-1 do

           with RowItem.AddChild(Uppercase(QryMater.Fields[I].FieldName)) do

             Text := VarToCompatibleStr(QryMater.Fields[I].Value);

 

         //refresh dotazu na kategorie

         QryCateg.Params[0].AsString :=

           QryMater.FieldByName('id_material').AsString;

         QryCateg.Close;

         QryCateg.Open;

       

         //export sloupců z QryCateg

         while not QryCateg.Eof do begin

           CatItem := RowItem.AddChild('CATEGORY');

         

           for I := 0 to QryCateg.FieldCount-1 do

             with CatItem.AddChild(Uppercase(QryCateg.Fields[I].FieldName)) do

               Text := VarToCompatibleStr(QryCateg.Fields[I].Value);

             

           QryCateg.Next;

         end;

 

         QryMater.Next;

       end;

     finally

       QryCateg.Free;

       QryMater.Free;

     end;

     Xml.SaveToFile('c:\omater.xml');

   finally

     Xml.Free;

   end;

 finally

   Progress.Free;

 end;

end.

 

 

Související témata