Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Record zu XML File wandeln


Christi - Mo 21.07.08 17:33
Titel: Record zu XML File wandeln
Hallo DF,

ich möchte einen Record der stark verschachtelt ist und auf jeder Ebene sehr unterhiedliche variablen Typen hat in ein XML dokument überführen.
Damit ich nicht für jede in Klartext benannte Variable mit 4 zeilen Code als Node dem XML dokument inzugefügt werden muss möchte ich die struktur durchsuchen.

hat jeman einen Ansatz wie man das machen kann.

Kann auch eine Komponenten lösung sein. im moment bin ich für jede Idee dankbar.


mfg

Christi


Hidden - Mo 21.07.08 17:53

Hi und :welcome: im Delphi-Forum,

Ich bin kein Experte aber ist eine File of TMyRecord nicht einfacher? :)

mfG,


Yogu - Mo 21.07.08 20:06

user profile iconHidden hat folgendes geschrieben:
Ich bin kein Experte aber ist eine File of TMyRecord nicht einfacher?

Wenn er noch mehr speichern möchte, dann nicht.

Also...

Ein Record ist als ein Block im Speicher verfügbar. Das heißt, auch direkt untergeordnete Records sind in dieser Reihenfolge zu finden. Das ganze wird jedoch scheitern, wenn du nur Pointer auf die Unterobjekte in den Records gespeichert hast.

Das mal vorneweg. Jetzt zur Umsetzung:

Du gehst ganz einfach den Speicher vom Start des Recors Länge Byte durch, wandelst sie in eine hexadezimale Zeichenfolge um und speicherst diese in der XML-Datei.

Ein bisschen Code...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function BinaryToHexStr(Data: Pointer; Size: Integer) String;;
var i: Integer; Start: Integer; P: PByte; B: Byte;
begin
  Result := '';

  // Position des ersten Bytes ermitteln
  Start := Integer(Data);

  // Alle Bytes "abklappern" und in Rückgabewert schreiben
  for i := 0 to Size-1 do
  begin
    // Pointer des aktuellen Bytes ermitteln
    P := PByte(Start + i);

    // Byte auslesen
    B := P^;

    // Byte in Hex-Form in Result schreiben
    Result := Result + IntToHex(B, 2);
  end;
end;

Vielleicht könnte man noch etwas optimieren, da kenne ich mich nicht so aus :)

Grüße,
Yogu


Christi - Di 22.07.08 08:55

Das ist ja klasse,
Danke für die Antworten.

Bestimmt hätte ich es genauer beschreiben sollen.
Natürlich hat der Record auch ein paar Variablen und Arrays mit Strings und Stringlist, also Variablen die nur als "Pointer" hinterlegt sind. Alles andere wäre auch nicht praktikabel.

Eine eigene Speicher verwaltungskalsse zu erzeugen hatte ich auch schon gedacht.
Den Aufwand diese Struktur dann zu erstellen würde aber IMHO den gleichen Aufwand im Programm erzeugen, wie es fest zu codieren.
Alternativ habe ich überlegt einen Parser zu schreiben, der die verschachtelte Record Struktur einfach aus dem pas file rekonstruiert, darauf aufbauend die struktur durchsuchen könnte.

Allerdings habe ich da noch Zweifel, ob das so einfach geht wie ich mir das überlegt habe.
Ach ja natürlich sind die Strings zum groessten Teil alle für TNT Controls und benutzen UTF8.

Gruss

Christi