Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

xml sample/app settings in xml

Tags:

xml

delphi

can anyone help me to learn how to use XML. As a test i want to use XML instead of INI files for saving a program settings.

Thanks

like image 885
Remus Rigo Avatar asked Sep 10 '10 18:09

Remus Rigo


1 Answers

Rigo, you can use the IXMLDocument interface or the TXMLDocument object to interact with a XML document.

You can check these links for more information about XML and Delphi

  • Creating, Parsing and Manipulating XML Documents with Delphi
  • Xml Serialization - Basic Usage (Delphi 2010)
  • Practical XML in Delphi (From @Jeroen)

Check this sample code , to learn the basics about xml management using the IXMLDocument interface.

program Delphi_XmlSaveSettings;

{$APPTYPE CONSOLE}
uses
  ActiveX,
  SysUtils,
  XmlDoc,
  XmlIntf;
//this class mimic the basics functionalities of an TIniFile
//you can improve a lot the code adding exception handling and more methods for specifics tasks.
type
  TXMLSettings = class 
  private
    FFileName: string;
    FXMLDoc: IXMLDocument; //Main XMLObject
  public
    constructor Create(const FileName: string); overload;
    destructor  Destroy; override;
    function    ReadString(const Section, Key, default: string): string;
    procedure   WriteString(const Section, Key, Value: string);
    function    ReadInteger(const Section, Key: string; default: Integer): Integer;
    procedure   WriteInteger(const Section, Key: string; Value: Integer);
    function    ReadBoolean(const Section, Key: string; default: Boolean): Boolean;
    procedure   WriteBoolean(const Section, Key: string; Value: Boolean);
    function    ReadDouble(const Section, Key: string; default: Double): Double;
    procedure   WriteDouble(const Section, Key: string; Value: Double);
    function    ReadDateTime(const Section, Key: string; default: TDatetime): TDateTime;
    procedure   WriteDatetime(const Section, Key: string; Value: TDatetime);
    function    ReadDate(const Section, Key: string; default: TDatetime): TDateTime;
    procedure   WriteDate(const Section, Key: string; Value: TDatetime);
    procedure   Save;
  end;



constructor TXMLSettings.Create(const FileName: string);
begin
  inherited Create;
  FFileName       := FileName;
  FXMLDoc         := NewXMLDocument; //Create  aNew instance of a XML Document
  FXMLDoc.Encoding:= 'UTF-8'; //Set the encoding
  FXMLDoc.Options := [doNodeAutoIndent];//optional, is used to indent the Xml document

  if FileExists(FFileName) then
    FXMLDoc.LoadFromFile(FFileName)
  else
    FXMLDoc.AddChild('Root'); //Create the root Node
end;


destructor TXMLSettings.Destroy;
begin
  Save;
  inherited;
end;

function TXMLSettings.ReadBoolean(const Section, Key: string; default: Boolean): Boolean;
begin
  Result := Boolean(ReadInteger(Section, Key, Integer(default)));
end;

function TXMLSettings.ReadDate(const Section, Key: string; default: TDatetime): TDateTime;
begin
  Result := StrToDate(ReadString(Section, Key, DateToStr(default)));
end;

function TXMLSettings.ReadDateTime(const Section, Key: string; default: TDatetime): TDateTime;
begin
  Result := StrToDateTime(ReadString(Section, Key, DateTimeToStr(default)));
end;

function TXMLSettings.ReadDouble(const Section, Key: string;  default: Double): Double;
begin
  Result := StrToFloat(ReadString(Section, Key, FloatToStr(default)));
end;

function TXMLSettings.ReadInteger(const Section, Key: string; default: Integer): Integer;
begin
  Result := StrToInt(ReadString(Section, Key, IntToStr(default)));
end;

function TXMLSettings.ReadString(const Section, Key, default: string): string; 
var
  XMLNode: IXMLNode;
begin
  XMLNode := FXMLDoc.DocumentElement.ChildNodes.FindNode(Section);
  if Assigned(XMLNode) and XMLNode.HasAttribute(Key) then //Check if exist the Key
    Result := XMLNode.Attributes[Key]
  else
    Result := default;
end;

procedure TXMLSettings.Save;
begin
  FXMLDoc.SaveToFile(FFileName);
end;

procedure TXMLSettings.WriteBoolean(const Section, Key: string; Value: Boolean);
begin
  WriteInteger(Section, Key, Integer(Value));
end;

procedure TXMLSettings.WriteDate(const Section, Key: string; Value: TDatetime);
begin
  WriteString(Section, Key, DateToStr(Value));
end;

procedure TXMLSettings.WriteDatetime(const Section, Key: string;  Value: TDatetime);
begin
  WriteString(Section, Key, DateTimeToStr(Value));
end;

procedure TXMLSettings.WriteDouble(const Section, Key: string; Value: Double);
begin
  WriteString(Section, Key, FloatToStr(Value));
end;

procedure TXMLSettings.WriteInteger(const Section, Key: string; Value: Integer);
begin
  WriteString(Section, Key, IntToStr(Value));
end;

procedure TXMLSettings.WriteString(const Section, Key, Value: string);
var
  XMLNode: IXMLNode;
begin
  XMLNode := FXMLDoc.DocumentElement.ChildNodes.FindNode(Section);
  if not Assigned(XMLNode) then
  XMLNode := FXMLDoc.DocumentElement.AddChild(Section);
  XMLNode.Attributes[Key] := Value;
end;


Procedure SaveSettings; //Store the settings
Var
  AppSettings :  TXMLSettings;
begin
  AppSettings:=TXMLSettings.Create(ExtractFilePath(ParamStr(0))+'MySettings.xml');
  try
   AppSettings.WriteString('Server','Type','SQLServer');
   AppSettings.WriteString('Server','User','root');
   AppSettings.WriteInteger('Server','port',1433);
   AppSettings.WriteString('Server','IP','192.168.1.1');
   AppSettings.WriteString('Server','Database','Prod');
   AppSettings.WriteBoolean('Server','WindowsAuth',False);
   AppSettings.WriteDouble('Server','Latency',25.90892);
   AppSettings.WriteDatetime('Server','LastAccess',Now);
   AppSettings.WriteDate('Server','ActualDate',Now);
   AppSettings.Save;
  finally
  AppSettings.Free;
  end;
  Writeln('Settings Saved');
end;


Procedure ShowSettings;//Read the settings
Var
  AppSettings :  TXMLSettings;
begin
  AppSettings:=TXMLSettings.Create(ExtractFilePath(ParamStr(0))+'MySettings.xml');
  try
   Writeln(Format('Type         %s',[AppSettings.ReadString('Server','Type','')]));
   Writeln(Format('Port         %d',[AppSettings.ReadInteger('Server','port',0)]));
   Writeln(Format('IP           %s',[AppSettings.ReadString('Server','IP','')]));
   Writeln(Format('Database     %s',[AppSettings.ReadString('Server','Database','')]));
   Writeln(Format('WindowsAuth  %s',[BoolToStr(AppSettings.ReadBoolean('Server','WindowsAuth',True),True)]));
   Writeln(Format('Latency      %g',[AppSettings.ReadDouble('Server','Latency',0)]));
   Writeln(Format('LastAccess   %s',[DateTimeToStr(AppSettings.ReadDateTime('Server','LastAccess',Now-1))]));
   Writeln(Format('ActualDate   %s',[DateToStr(AppSettings.ReadDate('Server','ActualDate',Now-1))]));
  finally
  AppSettings.Free;
  end;
end;

begin
  try
    CoInitialize(nil); //only necesary in console applications
    try
      SaveSettings; //Save the sample settings
      ShowSettings; //Read the stored settings
      Readln;
    finally
    CoUninitialize; //only necesary in console applications
    end;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
like image 159
RRUZ Avatar answered Sep 29 '22 22:09

RRUZ