![]() |
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. |
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:
Wie XMLHeader und Footer aussehen müssen, guggst du dir am besten mal in einem XML-Dokument an. :)
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; |
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:
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.
//______________________________________________________________________________
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz