[ Pobierz całość w formacie PDF ]
zować podstawowe operacje.
Na początek tworzymy pusty plik:
procedure TMainForm.btnPUSTY_PLIKClick(Sender: TObject);
var
ini
: MXML;
begin
fn := ExtractFilePath(Application.ExeName) + 'nowy.xml';
if FileExists(fn) then
begin
DeleteFile(fn);
end;
try
ini := MXML.Create(fn);
finally
FreeAndNil(ini);
end;
// pokaż zawartość w Memo
Wczytaj();
end;
Tworzeniem pustego pliku XML zajmuje się konstruktor klasy MXML:
constructor MXML.Create(const FileName : String);
begin
XMLFileName := FileName;
Wiersze
:= TStringList.Create();
if FileExists(FileName) then
begin
Wiersze.LoadFromFile(XMLFileName);
end
else begin
Wiersze.Add('?xml version = "1.0" encoding = "Windows-1250"?');
Wiersze.Add('xmlini');
// root
Wiersze.Add('info');
Wiersze.Add('program' + Version + '/program');
Wiersze.Add('/info');
Wiersze.Add('/xmlini');
Wiersze.SaveToFile(XMLFileName);
end;
318
Delphi 2007 dla WIN32 i bazy danych
// jeżeli plik był pusty
if Wiersze.Count = 0 then
begin
Wiersze.Add('?xml version = "1.0" encoding = "Windows-1250"?');
Wiersze.Add('xmlini');
Wiersze.Add('info');
Wiersze.Add('program' + Version + '/program');
Wiersze.Add('/info');
Wiersze.Add('/xmlini');
Wiersze.SaveToFile(XMLFileName);
end;
end;
Po utworzeniu plik nowy.xml ma postać zaprezentowaną poniżej.
?xml version = "1.0" encoding = "Windows-1250"?
xmlini
info
programXMLINI 1.0/program
/info
/xmlini
Występuje w nim węzeł główny xmlini:
xmlini /xmlini
oraz węzły info i program.
Dodajemy do pliku przykładową sekcję adres:
procedure TMainForm.btnADD_ADRESClick(Sender: TObject);
var
ini : MXML;
begin
Memo.Lines.Clear();
fn := ExtractFilePath(Application.ExeName) + 'nowy.xml';
if not FileExists(fn) then
begin
ShowMessage('Brak pliku: ' + fn);
exit;
end;
try
ini := MXML.Create(fn);
if not ini.SectionExist('adres') then
begin
ini.AddSection('adres');
Rozdział 11. ♦ XML i DOM
319
ini.WriteString('adres', 'ulica' , '3 Maja 132');
ini.WriteString('adres', 'miasto', 'Pszczyna');
ini.WriteString('adres', 'kodp'
, '43-200');
end;
finally
FreeAndNil(ini);
end;
Memo.Lines.Clear();
Wczytaj();
Memo.Visible := True;
end;
A procedura dodająca sekcję (w pliku XML — węzeł) wygląda następująco:
procedure MXML.AddSection(const Section : String);
var
iLast : Integer;
begin
iLast := Wiersze.Count-1;
Wiersze.Delete(iLast);
Wiersze.Add(''
+ Section + '');
Wiersze.Add('/' + Section + '');
Wiersze.Add('/xmlini');
end;
Konieczne jest usunięcie z niej ostatniego wiersza zawierającego znacznik zamykają-
cy dla głównego znacznika pliku XML. Zapis pojedynczego elementu uzyskaliśmy po-
przez WriteString:
procedure MXML.WriteString(const Section : String;
const Name
: String;
const Value
: String);
var
txt : String;
idx : Integer;
begin
// jeżeli sekcja ma już taki węzeł, to go usuwam
if ValueExist(Section, Name) then
begin
DeleteKey(Section, Name);
end;
txt := '';
txt := txt + '' + Name + '' + Value + '/' + Name + '';
idx := SectionIndex(Section);
Wiersze.Insert(idx+1, txt);
end;
320
Delphi 2007 dla WIN32 i bazy danych
Sprawdzenie, czy sekcja istnieje, wykonuje funkcja:
function MXML.SectionExist(const Section : String) : Boolean;
begin
if Wiersze.IndexOf('' + Section + '') = 0 then
begin
Result := True;
end
else begin
Result := False;
end;
end;
Na koniec jeszcze możliwość usunięcia sekcji:
procedure MXML.EraseSection(const Section: String);
var
lp
: Integer;
start
: Integer;
koniec : Integer;
begin
start
:= Wiersze.IndexOf(''
+ Section + '');
koniec := Wiersze.IndexOf('/' + Section + '');
lp := koniec;
while lp = start do
begin
Wiersze.Delete(lp);
Dec(lp);
end;
end;
Likwidując obiekt klasy MXML, trzeba pamiętać o zwolnieniu pamięci zajmowanej przez
wiersze:
destructor MXML.Destroy();
begin
if Assigned(Wiersze) then
begin
// zrzut aktualnej zawartości do pliku
Wiersze.SaveToFile(XMLFileName);
Wiersze.Clear();
FreeAndNil(Wiersze);
end;
inherited;
end;
Mimo nieco przewrotnego traktowania pliku XML jak pliku INI, zachowuje on nadal
cechy pliku XML, o czym można się przekonać, wczytując zawartość pliku XML do
przeglądarki. Poniżej mamy przykładową zawartość pliku po dodaniu sekcji adres
oraz dzieci.
Rozdział 11. ♦ XML i DOM
321
?xml version = "1.0" encoding = "Windows-1250"?
xmlini
info
program1.0/program
/info
adres
kodp43-200/kodp
miastoPszczyna/miasto
ulica3 Maja 132/ulica
/adres
dzieci
córkaMarzena/córka
synPiotr/syn
/dzieci
/xmlini
Podsumowanie
Przedstawiłem tylko bardzo wąski fragment dotyczący elementów przetwarzania pli-
ków XML z wykorzystaniem środowiska Delphi. Zachęcam do poznawania dalszych
tajników budowy pliku XML i własnych eksperymentów.
[ Pobierz całość w formacie PDF ]