Delphi’de Xml okuma-yazma örneği

Xml dosyalar insanlar ve bilgi işlem sistemlerinin kolayca işleyebileceği yazı dosyası şeklinde dokümanlardır. Xml dosyaları farklı sistemler arasında veri alışverişini sağlar. Xml dosyalar standartlaştırılmıştır ve geniş uygulama alanı vardır.

Aşağıdaki Delphi örneği var olan bir Xml dosyasını iki farklı şekilde okuma ve yeni bir Xml dosyası yazması yapmaktadır.

Örneğin tasarım şekli :

Xml Örnek tasarım şekli

Örneğin ilk çalışma şekli:

Xml Örnek ilk çalışma

Örnek Xml dosyası okunduktan sonraki şekli:

Xml Örnek dosya okunma

Örnek Xml dosyası yazma şekli:

Xml Örnek dosya yazma

Hazır Xml dosyasının (dersler.xml) yapısı aşağıdaki şekildedir (dersler.xml dosyası uygulamayla aynı yere kaydedilmelidir) :

<?xml version="1.0" encoding="windows-1254"?>
<OgrenciDersleri>
  <Ders Dersadi="Matematik">
    <Derssaati>5</Derssaati>
    <Dersnotu>70</Dersnotu>
  </Ders>
  <Ders Dersadi="Beden Eğitimi">
    <Derssaati>2</Derssaati>
    <Dersnotu>90</Dersnotu>
  </Ders>
  <Ders Dersadi="Müzik">
    <Derssaati>2</Derssaati>
    <Dersnotu>90</Dersnotu>
  </Ders>
  <Ders Dersadi="Türkçe">
    <Derssaati>4</Derssaati>
    <Dersnotu>100</Dersnotu>
  </Ders>
</OgrenciDersleri>

Burada OgrenciDersleri Ana (Root) Node’dur. Ders Çocuk (Child) Node’dur
Ders Child node’nun altındaki Derssaati ve Dersnotu SubChild Node’lardır.

Dersleri Ac ve Dersler Ac 2 butonlarından herhangi birisine tıklandığında önceden kaydedilmiş dersler.xml dosyası okunur ve stringrid’de gösterilir. Burada 2 farklı buton olmasının sebebi iki farklı şekilde okuma örneğinin olmasıdır.

Dersleri Kaydet butonuna tıklandığında eğer önceden dersler açılmışsa aynı şekilde kaydedilir. Önceden dersler açılmamışsa boş xml dosyası oluşturulur. Dosyanın ismi dersler1.xml dir.

Uygulamaya 3 adet Button, 1 adet Stringgrid, 1 adet XMLDocument bileşen eklenir.

Form ve bileşenlerin Properties’deki Tasarım Anı ayarları (dfm dosyası) aşağıdaki şekildedir :

object Form1: TForm1
  Left = 287
  Top = 216
  Width = 498
  Height = 287
  Caption = 'XMLOrnek'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object btnDersleriAc: TButton
    Left = 40
    Top = 8
    Width = 89
    Height = 25
    Caption = 'Dersleri Ac'
    TabOrder = 0
    OnClick = btnOgrenciDersleriAcClick
  end
  object sgDersler: TStringGrid
    Left = 8
    Top = 39
    Width = 465
    Height = 205
    ColCount = 4
    FixedCols = 0
    RowCount = 2
    Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSelect]
    TabOrder = 1
    ColWidths = (
      50
      260
      80
      64)
  end
  object btnDersleriKaydet: TButton
    Left = 296
    Top = 8
    Width = 97
    Height = 25
    Caption = 'Dersleri Kaydet'
    TabOrder = 2
    OnClick = btnOgrenciDersleriKaydetClick
  end
  object btnDersleriAc2: TButton
    Left = 136
    Top = 8
    Width = 89
    Height = 25
    Caption = 'Dersleri Ac 2'
    TabOrder = 3
    OnClick = btnOgrenciDersleriAc2Click
  end
  object XMLDocument1: TXMLDocument
    Left = 240
    Top = 112
    DOMVendorDesc = 'MSXML'
  end
end

Örneğin kodu :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Forms, Dialogs, msxmldom, XMLDoc,  ComCtrls,
  xmldom, XMLIntf, StdCtrls, Controls, Grids;

type
  TForm1 = class(TForm)
    XMLDocument1: TXMLDocument;
    btnDersleriAc: TButton;
    sgDersler: TStringGrid;
    btnDersleriKaydet: TButton;
    btnDersleriAc2: TButton;
    procedure btnOgrenciDersleriAcClick(Sender: TObject);
    procedure btnOgrenciDersleriKaydetClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure OgrenciDersleriAc(dosya:string; sgrid: TStringGrid);
    procedure OgrenciDersleriAc2(dosya:string; sgrid: TStringGrid);
    procedure OgrenciDersleriKaydet(dosya:string; sgrid: TStringGrid);
    procedure btnOgrenciDersleriAc2Click(Sender: TObject);
    procedure SGrid_SatirSil(sgrid: TStringGrid; st: Integer);
    procedure SGrid_IlkHaricTumSatirlariSil(sgrid: TStringGrid);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  dyolu, dyolu1: string;

implementation

{$R *.dfm}

procedure TForm1.SGrid_SatirSil(sgrid: TStringGrid; st: Integer);
var i: Integer;
begin
  for i := st to sgrid.RowCount - 2 do
    sgrid.Rows[i].Assign(sgrid.Rows[i + 1]);
  sgrid.RowCount := sgrid.RowCount - 1;
end;

procedure TForm1.SGrid_IlkHaricTumSatirlariSil(sgrid: TStringGrid);
begin
 while (sgrid.RowCount>1) do  // Oldukca calışır
  begin
   SGrid_SatirSil(sgrid,2);
  end;
end;

procedure TForm1.btnOgrenciDersleriAcClick(Sender: TObject);
begin
  SGrid_IlkHaricTumSatirlariSil(sgDersler);
  OgrenciDersleriAc(dyolu, sgDersler);
end;

procedure TForm1.btnOgrenciDersleriAc2Click(Sender: TObject);
begin
  SGrid_IlkHaricTumSatirlariSil(sgDersler);
  OgrenciDersleriAc2(dyolu, sgDersler);
end;

procedure TForm1.OgrenciDersleriAc(dosya: string; sgrid: TStringGrid);
var Node, AltNode : IXMLNode;
begin
  XMLDocument1.FileName := dosya;
  XMLDocument1.Active := True;
  Node:=XMLDocument1.DocumentElement; // Ana Node <OgrenciDersleri>
  AltNode:=Node.ChildNodes.FindNode('Ders'); // Çocuk Node <Ders>
   // Bütün Çocuk <Ders> Node'ları okumak için
   // bitene kadar döngü yapılıyor
   repeat
    sgrid.RowCount := sgrid.RowCount + 1;
    sgrid.Cells[0, sgrid.RowCount-1]:=IntToStr(sgrid.RowCount-1);
    sgrid.Cells[1, sgrid.RowCount-1]:=AltNode.GetAttributeNS('Dersadi', '');
     // Ders adı Attribute'si okunup StringGride yazılıyor
    sgrid.Cells[2, sgrid.RowCount-1]:=AltNode.ChildNodes['Derssaati'].Text;
     // Derssaati Node'u okunup StringGride yazılıyor
    sgrid.Cells[3, sgrid.RowCount-1]:=AltNode.ChildNodes['Dersnotu'].Text;
     // Dersnotu Node'u okunup StringGride yazılıyor
    AltNode := AltNode.NextSibling;
    // Sonraki Node'a geçiliyor
   until AltNode = nil;  // Node'lar bitene kadar
  XMLDocument1.Active := False;
  sgrid.FixedRows := 1;
end;

procedure TForm1.OgrenciDersleriAc2(dosya:string; sgrid: TStringGrid);
var Node, AltNode : IXMLNode; i: Integer;
begin
  XMLDocument1.FileName := dosya;
  XMLDocument1.Active := True;
  Node:=XMLDocument1.DocumentElement; // Ana Node <OgrenciDersleri>
  AltNode:=Node.ChildNodes.FindNode('Ders'); // Çocuk Node <Ders>
   // Bütün Çocuk <Ders> Node'ları okumak için
   // Çocuk node sayısı kadar
   // döngü  yapılıyor
   for i:=0  to Node.ChildNodes.Count-1 do begin
    sgrid.RowCount := sgrid.RowCount + 1;
    sgrid.Cells[0, sgrid.RowCount-1]:=IntToStr(sgrid.RowCount-1);
    sgrid.Cells[1, sgrid.RowCount-1]:=Node.ChildNodes[i].GetAttributeNS('Dersadi', '');
     // Ders adı Attribute'si okunup StringGride yazılıyor
    sgrid.Cells[2, sgrid.RowCount-1]:=Node.ChildNodes[i].ChildNodes['Derssaati'].Text;
     // Derssaati Node'u okunup StringGride yazılıyor
    sgrid.Cells[3, sgrid.RowCount-1]:=Node.ChildNodes[i].ChildNodes['Dersnotu'].Text;
     // Dersnotu Node'u okunup StringGride yazılıyor
   end;
  XMLDocument1.Active := False;
  sgrid.FixedRows :=1 ;
end;

procedure TForm1.btnOgrenciDersleriKaydetClick(Sender: TObject);
Begin
 OgrenciDersleriKaydet(dyolu1, sgDersler);
end;

procedure TForm1.OgrenciDersleriKaydet(dosya:string; sgrid: TStringGrid);
var Node, AltNode, AltNode2: IXmlNODE; YeniXml: IXmlDOCUMENT; i: Integer;
begin
 YeniXml:= NewXmlDocument;
 YeniXml.Encoding := 'windows-1254';
 // Delphi 7 uyumu için windows-1254 yapıldı
 // Utf-8 ile unicode uyumlu olabilir  
 YeniXml.Options := [doNodeAutoIndent];
 Node := YeniXml.AddChild('OgrenciDersleri');
 if sgrid.RowCount>1 then begin
  for i := 2 to sgrid.RowCount do begin
   AltNode := Node.AddChild('Ders');
   AltNode.SetAttributeNS('Dersadi', '', sgrid.Cells[1, i-1]);
   AltNode2 := AltNode.AddChild('Derssaati');
   AltNode2.Text := sgrid.Cells[2, i-1];
   AltNode2 := AltNode.AddChild('Dersnotu');
   AltNode2.Text := sgrid.Cells[3, i-1];
  end;
 end;
 YeniXml.SaveToFile(dosya);
 ShowMessage('Dersler başarı ile kaydedildi !');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 sgDersler.Cells[0, 0] := 'Sn';
 sgDersler.Cells[1, 0] := 'Dersler';
 sgDersler.Cells[2, 0] := 'Ders saatleri';
 sgDersler.Cells[3, 0] := 'Ders notlari';
 dyolu := extractfilepath(application.ExeName)+'dersler.xml';
 dyolu1 := extractfilepath(application.ExeName)+'dersler1.xml';
end;

end.
Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s