![]() |
universaler record in Klasse
Hallo,
ich habe folgendes Problem: ich möchte verschiedene xml-Files, von verschiedenen Applikationen aus, parsen. Dafür schreibe ich eine Unit mit einer Klasse. Die wichtigste Eigenschaft dabei soll ein Record werden, der die Struktur, generiert über eine XPATH Anweisung, abbildet. Aus den einzelnen Applikationen sollen jetzt unterschiedlich aufgebaute Records übergeben werden. Die XML und die jeweilige Applikation (mit den Records) sind aufeinander abgestimmt. Die XML-Unit soll weitesgehend generisch sein, wird aber auch funktionell auf verschiedene XML's abgestimmt - d.h. ich übergebe den XML-Filename, XPATH-Pattern und einen speziellen Parameter - dieser dient dazu unterschiedliche Prozeduren/Funktionen aufzurufen die die speziellen Records zu füllen. Das ganze sieht ungefähr so aus: Bsp. XML
Code:
<CONFIG>
<!-- Section general Properties --> <generalProperties> <credentials> <server>test_s1</server> <scp_user>xy</scp_user> <sshKey>key.ppk</sshKey> </credentials> </generalProperties> <Testers> <Tester Type='T1'> <Program>prog.exe</Program> <SPath>C:\Program Files\zap\bin</SPath> <dest>/unix/calibrationdata_mflex</dest> <cPath Path='Tester'> <ProgPath>C:\Program Files\Tester</ProgPath> <cFiles>CurrentConfig.txt</cFiles> </cPath> <cPath Path='DCCM'> <ProgPath>C:\Program Files\SupportBoard\DCCM</ProgPath> <cFiles>*.txt;*.csv</cFiles> </cPath> <cPath Path='POOL_Logs'> <ProgPath>C:\Program Files\POOL_Calibration_Logs</ProgPath> <cFiles>*</cFiles> </cPath> </Tester> <Tester Type='T2'> . . . </Tester> </Testers> es gibt jetzt z.B. 2 Records
Delphi-Quellcode:
diese beiden Records befinden sich in einer Applikation
// Record 1
credR = record server : string; scp_user : string; sshKey : string; end; credPtr = ^credR; // Record 2 xmlRec = record Program : TStringList; cPath : cPathDict; SPath : string; dest : string; end; xmlPtr = ^xmlRec; In der xml-Unit ist jetzt eine Klasse definiert wie:
Delphi-Quellcode:
Was ich jetzt gern machen würde wäre folgendes:
TXML = Class
private FRC : Integer; FErrStr : string; debugS : string; FxmlF : PAnsiChar; FxmlPar : string; FPattern : PAnsiChar; Fdebug : TStrings; public constructor Create(dpar : string); Destructor Destroy; override; procedure/function readXML(XMLfile : xx; .. : yy...); // xmlRec : ?????????? property xmlFile : string Read FxmlF; property xmlPar : PAnsiChar Read FxmlPar; property rc : Integer Read FRC; property errStr : string Read FErrStr; property pattern : PAnsiChar Read FPattern; property debugL : TStrings Read Fdebug Write Fdebug; end; in der Applikation wird die Klasse initialisiert, der Record 1 wird übergeben und durch eine Procedure/Function in der Unit gefüllt in einem späteren Schritt möchte ich über eine andere Procedure/Function den Record 2 füllen Ich hoffe es ist einigermaßen verständlich :spin: Meine Frage: ist dies möglich und wenn ja dann WIE?? |
AW: universaler record in Klasse
Welche Delpi-Version setzt du ein?
Bei einer neueren kannst du dein Problem mit Generics leicht erschlagen. |
AW: universaler record in Klasse
Delphi 10.3
den Pfad der Generics habe ich auch schon betreten - mir fehlt aber der Einstieg - vor lauter Pfaden sehe ich den Weg nicht... :wall: :glaskugel: |
AW: universaler record in Klasse
Hi,
sind die verschiedenen "Gestalten" der Datenobjekte vorher bekannt oder muß man bei jedem Anwendungsfall auf eine neue, unerwartete Struktur des XML-Files resp. Datenobjekts gefaßt sein ? Und ich würde keine Records, sondern gleich Objekte erzeugen, obwohl Records in Delphi 10 schon heftig den Objekten ähneln. ism |
AW: universaler record in Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
so - ich habe jetzt mal ein Bild erstellt - hoffe das es jetzt etwas verständlicher ist
Falls noch Unklarheiten bestehen sollten einfach fragen - ich kann auch das Original hochladen, wenn nötig Das Schema habe ich mit yEd erstellt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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 by Thomas Breitkreuz