Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Delphi klasse in xml format exportieren (https://www.delphipraxis.net/87916-delphi-klasse-xml-format-exportieren.html)

usman78 7. Mär 2007 11:39


Delphi klasse in xml format exportieren
 
Hallo Fachleute,
Meine Frage ist folgendes:

Ich habe eine Delphi-Klasse.... angenommen -> Person mit Attributen wie name,vorname,Adresse,plz,GebDatum etc etc.
Ich muss jetzt nur noch einen Modul schreiben welches mir diese Daten von Person in einer xml Datei mit xml format ausgeben.

Das Format soll folgendes aussehen

<Person>
<name> mustername </name>
<vorname> mustervorname </vorname>
<Adresse> musterAdresse </Adresse>
.....
.....
..... usw.
</Person>

Alle attribute sind vom typ string



Kann mir Bitte jemand mitteilen, wie man es am besten machen kann.
Danke vielmals dafür im voraus.

Ghostwalker 7. Mär 2007 16:03

Re: Delphi klasse in xml format exportieren
 
Also...wenns einfach sein soll, bau dir eine Methode, die dir via Format deine Datenfelder in einen String umwandelt, häng den XML-Header/Footer rann und fertig.

Ein kleines Muster mal als Beispiel:


Delphi-Quellcode:
const
   cTagBegin='<%s>%s';
   cTagEnd='</%s>';

  :
function TPerson.PersonToString:String;
begin
  result := format(cTagBegin,['Person','']);
  result := result+format(cTagBegin,['Name',fname])+format(cTagEnd,['Name']);
   :
end;

procedure TPerson.SchreibeXMLDatei;
var
  output : TStrings;
begin
  output := TStringlist.create;
  output.append(cXMLHeader);
  output.append(MyPerson.PersonToString);
   :
  ouput.append(cXMLFooter);
  output.savetofile(MyFilename);
  output.free;
end;
Wie XMLHeader und Footer aussehen müssen, guggst du dir am besten mal in einem XML-Dokument an. :)

Sidorion 7. Mär 2007 16:16

Re: Delphi klasse in xml format exportieren
 
Schau Dir mal die Unit TypInfo an. Da kannst Du auf die RTTI zugreifen, die Delphi auch intern zum streamen von Klassen benutzt. Über die RTTI kannst Du (fast) alle Attributtypen in Strings verwandeln und umgekehrt. Diese musst Du dann nur noch passend aufarbeiten. Hier mal als Anregung ein Stück aus meinem XML-Parser delegaten für mein XML-Interface:
Delphi-Quellcode:
//______________________________________________________________________________
function TXMLStreamDelegate.ReadFromXML(_oParent: IXMLNode): Boolean;
Var
  bOwnerHandled: Boolean;
  dValue:       Extended;
  iCount:       Integer;
  iLoop:        Integer;
  iValue:       Integer;
  pInfo:        PPropList;
  sName:        String;
  sValue:       String;
  oNode:        IXMLNode;
  oObj:         TObject;
  oXMLStream:   IXMLStream;
begin
  Result:=True;
  iCount:=GetPropList( Owner, pInfo);
  For iLoop:=0 To Pred(iCount)
  Do Begin
    sName:=pInfo[iLoop].Name;
    bOwnerHandled:=False;
    If Assigned(OnOwnerSreamProperty)
    Then Result:=OnOwnerSreamProperty( sName, _oParent, saRead, bOwnerHandled);
    If Not bOwnerHandled
    And Result
    Then Begin
      Case pInfo[iLoop].PropType^.Kind Of
        tkClass: Begin
          oObj:=GetObjectProp( Owner, sName);
          If oObj.GetInterface( IXMLStream, oXMLStream)
          Then Begin
            oNode:=_oParent.ChildNodes.FindNode(sName);
            If Assigned(oNode)
            Then oXMLStream.ReadFromXML(oNode)
            Else Result:=False;
          End;
        End;
        tkInteger,
        tkChar,
        tkWChar: Begin
          Result:=ReadValue( _oParent, sName, iValue);
          If Result
          Then SetOrdProp( Owner, pInfo[iLoop], iValue);
        End;
        tkEnumeration: Begin
          Result:=ReadValue( _oParent, sName, sValue);
          If Result
          Then SetEnumProp( Owner, pInfo[iLoop], sValue);
        End;
        tkSet: Begin
          Result:=ReadValue( _oParent, sName, sValue);
          If Result
          Then SetSetProp( Owner, pInfo[iLoop], sValue);
        End;
        tkFloat: Begin
          Result:=ReadValue( _oParent, sName, dValue);
          If Result
          Then SetFloatProp( Owner, pInfo[iLoop], dValue);
        End;
        tkMethod: ;
        tkString,
        tkLString: Begin
          Result:=ReadValue( _oParent, sName, sValue);
          If Result
          Then SetStrProp( Owner, pInfo[iLoop], sValue);
        End;
        tkWString: Begin
          Result:=ReadValue( _oParent, sName, sValue);
          If Result
          Then SetWideStrProp( Owner, pInfo[iLoop], sValue);
        End;
        tkInt64: Begin
          Result:=ReadValue( _oParent, sName, iValue);
          If Result
          Then SetInt64Prop( Owner, pInfo[iLoop], iValue);
        End;
        Else Begin
          raise EPropertyConvertError.CreateResFmt( @SInvalidPropertyType,
                                                 [pInfo[iLoop].PropType^.Name]);
        End;
      end;
    End;
    If Not Result
    Then Break;
  End;
  If Result
  And Assigned(OnOwnerStream)
  Then Result:=OnOwnerStream( _oParent, saRead);
end;
In dem Beispiel ist der Delegat ein Member einer beliebiggen TComponent-Klasse die das Interface IXMLStream bereitstellt. Die Events OnOwnerStream und OnOwnerStreamProperty dienen dazu, dass die Owner-Instanz u.U. selber properties schreiben und lesen kann. Alles erklären würde zu weit führen und den ganzen Code will ich eigentlich auch nicht posten :twisted: aber ich hoffe, ich hab deine Gizmos angeregt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz