|
|
XML dokumentum létrehozása programból
XML 4. rész
|
|
Példaprogram letöltése
13502 bájt
|
Az XML formátum sok mindenre használható, többek között adatbázisok tárolására is. Ebben a példában egy olyan programot készítünk, amely egy lekérdezés eredményéből állít elő egy XML dokumentumot.
Az így elkészített fájlok nagy előnye, hogy a megfelelő stíluslap hozzáadásával könnyedén publikálhatjuk az eredményt, például a WEB-en, de mint azt majd a későbbi példákban is látni fogjuk, az ilyen XML dokumentumokból visszanyerhetők az adatok.
A lekérdezésnél összesen 3 db táblát kapcsolunk össze, melyek a DBDEMOS alias alatt érhetők el. A lekérdezésben egy adat többször is előfordul, viszont az XML dokumentumba úgy írjuk ki az adatokat, hogy egy adat csak egyszer szerepeljen, ettől a dokumentum felépítése hierarchikus lesz.
A lekérdezés adataiban szerepelhetnek olyan karakterek, melyek egy XML dokumentumban speciális szerepet töltenek be. Ilyen például a "&" karakter is, ezért mielőtt az ilyen adatokat tárolnánk, ezeket a karaktereket ki kell cserélni a nekik megfelelő karakteregyedre. Ez a "&" karakter esetében "&". A cserét a GetXMLString függvény végzi el, amely jelen esetben csak ezt az egy karaktert figyeli:
function GetXMLString(s: string):string;
begin
s:=StringReplace(s, '&', '&', [rfReplaceAll]);
result:=s;
end;
A dokumentum létrehozása a Form-on található TMemo komponensben történik. Az AddLine eljárás a paraméterként megkapott sztringet hozzáadja a dokumentumhoz úgy, hogy előtte meghívja a GetXMLString függvényt.
A dokumentum létrehozása a FormOnCreate eseményénél történik meg.
Az első sor azonosítja a dokumentumot, a második sor egy megjegyzés, míg a harmadik sor a dokumentum nyitó eleme, amely az összes többi elemet tartalmazni fogja. Az ilyen típusú elemből csak egy létezhet egy dokumentumban. Az elemek nevét egyébként tetszőlegesen megválaszthatjuk, de esetünkben érdemes az adatbázis tábláinak és mezőinek nevét használni.
AddLine('<?xml version="1.0" standalone="yes"?>');
AddLine('<!-- Animare Software peldaprogram -->');
AddLine('<customers>');
Megnyitjuk a lekérdezést, és végighaladunk rajta úgy, hogy közben kiolvassuk az aktuális rekord adatait, és eltároljuk a dokumentumban.
with Query1 do begin
Open;
while not eof do begin
A customer elem a Customer tábla adatait tartalmazza, ezen belül lesznek az Orders tábla, és azon belül az Employee tábla adatai. A customer elemnek van egy attribútuma is, ennek neve azon. Erre a későbbiekben szükség lehet az elem egyértelmű azonosításához. A customer elemen belül a country, company és city elemek közé beillesztjük a megfelelő adatokat, majd mindegyik elemet lezárjuk. Ha olyan adatot akarunk eltárolni, aminek nem kell megjelennie, akkor azt attribútumként is megadhatjuk, hasonlóan az azon-hoz.
AddLine(t1+'<customer azon="C'+FieldByName('CustNo').AsString+'">');
AddLine(t2+'<company>'+GetXMLString(FieldByName('Company').AsString)+'</company>');
AddLine(t2+'<city>'+GetXMLString(FieldByName('City').AsString)+'</city>');
AddLine(t2+'<country>'+GetXMLString(FieldByName('Country').AsString)+'</country>');
CustNo:=FieldByName('CustNo').AsInteger;
A CustNo változóban eltároltuk a customer azonosítóját, amit az alábbi ciklusban használunk fel. Az order elemnek szintén van egy azon attribútuma, az azonosításhoz. Az order elemen belül található az employee elem, és azon belül az ampno, firstname, lastname, phone, hiredate és salary elemek, mindegyik a megfelelő adatot közrefogva.
repeat
Memo1.Lines.Append(t2+'<order azon="O'+FieldByName('OrderNo').AsString+'">');
AddLine(t3+'<employee>');
AddLine(t4+'<empno>'+FieldByName('EmpNo').AsString+'</empno>');
…
AddLine(t3+'</employee>');
Memo1.Lines.Append(t2+'</order>');
Next;
Ha a CustNo mező értéke különbözik a CustNo változó értékétől, akkor lezárjuk a customer elemet.
until (CustNo<>FieldByName('CustNo').AsInteger) or eof;
Memo1.Lines.Append(t1+'</customer>');
end;
end;
A dokumentum végén a customers elemet is le kell zárni. Ha ez is megvan, akkor elmentjük a fájlt a program könyvtárába "test.xml" néven. Ha ezt a fájlt megnyitjuk például az Internet Explorer-rel, akkor látni fogjuk a dokumentumban található adatok hierarchikus elrendezését, vagyis a dokumentum felépítését.
Memo1.Lines.Append('</customers>');
Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'test.xml');
Screen.Cursor:=crDefault;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 395. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|