Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#183

Re: himXML (gesprochen himix ML)

  Alt 29. Nov 2009, 18:45
Wie gesagt, XPath wird noch etwas dauern, da dieses Aufgrund der Komplexität nich so einfach umzusetzen ist.

In der Zwischenzeit hab ich aber schonmal die Serialisierungen überarbeitet.
- Variant-(De)Serialisierung ist fertig
- Record-Serialisierung scheint wieder zu laufen
- Record-Deserialisierung ist grad in arbeit (muß komlett geändert werden, da sich die Serialisierung änderte)
- die Objektserialisierung kommt danach dran, hat aber schon einige Änderungen erhalten
und Aufgrund neuer Erkenntnisse wird die Deserialisierung auch bald laufen

ein Update der Dateien wird es die nächsten Tage geben (wollte nur schonmal was sagen, bevor ich's vergeß)

mein D2010 sollte auch bald ankommen und dann werd' ich mal sehn was die neue RTTI hierfür (Record-Analyse und Co.) zu bieten hat.

Record/Array-Serialisierung:
Delphi-Quellcode:
Var Test: TSearchRec;
  XML: TXMLFile;
  RI, RIx: TXMLSerializeRecordInfo;
  SL: TStrings;

// einfach nur den Record mit irgendetwas befüllen
FindFirst(Application.ExeName, faAnyFile, Test);
FindClose(Test);

XML := TXMLFile.Create;
Try

  RI := TXMLSerializeRecordInfo.Create;
  Try
    RI.SaveTypeInfos := True;

    RI.Add('Time', rtInteger);
    RI.Add('Size', rtInt64);
    RI.Add('Attr', rtInteger);
    RI.Add('Name', rtString);
    RI.Add('Exclude', rtInteger);
    RI.Add('Handle', rtLongWord);
    RIx := RI.Add('Data', rtRecord);
    RIx.Add('Attributes', rtLongWord);
    RIx.Add('Creation', rtWord64BE);
    RIx.Add('LastAccess', rtWord64BE);
    RIx.Add('LastWrite', rtWord64BE);
    RIx.Add('FileSize', rtWord64LE);
    RIx.Add('Reserved0', rtLongWord);
    RIx.Add('Reserved1', rtLongWord);
    RIx.Add('FileName', rtCharArray, 260);
    RIx.Add('Alternate', rtCharArray, 14);

    // RI.Parse('I"Time" I8"Size" I"Attr" S"Name" I"Exclude" W4"Handle" R"Data" ('
    // + 'W4"Attributes" WE"Creation" WE"LastAccess" WE"LastWrite" IX"FileSize"'
    // + 'W4"Reserved0" W4"Reserved1" C260"FileName" C14"Alternate" )');

    // RI.Parse('I I8 I S I W4 R ( W4 WE WE WE WX W4 W4 C260 C14 )');

    // RI.Parse('ii8isiw4r(w4wewewewxw4w4c260c14)');

    XML.AddNode('TestRec').Serialize(Test, RI);
  Finally
    RI.Free;
  End;

  XML.SaveToFile('Test.xml');
Finally
  XML.Free;
End;

//type
// TFileName = type String;
// THandle = LongWord;
// TWin32FindData = record
// dwFileAttributes: DWORD;
// ftCreationTime: TFileTime;
// ftLastAccessTime: TFileTime;
// ftLastWriteTime: TFileTime;
// nFileSizeHigh: DWORD;
// nFileSizeLow: DWORD;
// dwReserved0: DWORD;
// dwReserved1: DWORD;
// cFileName: array[0..259] of Char;
// cAlternateFileName: array[0..13] of Char;
// end;
//
// TSearchRec = record
// Time: Integer;
// Size: Int64;
// Attr: Integer;
// Name: TFileName;
// ExcludeAttr: Integer;
// FindHandle: THandle;
// FindData: TWin32FindData;
// end;
je nach Einstellung würde z.B. eines der folgenden Ergebnisse entstehen:
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml>
  <TestRec>
    <Time himxml:type="LongInt">998079892</Time>
    <Size himxml:type="Int64">978432</Size>
    <Attr himxml:type="LongInt">8224</Attr>
    <Name himxml:type="WideString">Test.exe</Name>
    <Exclude himxml:type="LongInt">0</Exclude>
    <Handle himxml:type="LongWord">4294967295</Handle>
    <Data himxml:type="Record">
      <Attributes himxml:type="LongWord">8224</Attributes>
      <Creation himxml:type="Word64">129031275541718750</Creation>
      <LastAccess himxml:type="Word64">129039794795625000</LastAccess>
      <LastWrite himxml:type="Word64">129039794795625000</LastWrite>
      <FileSize himxml:type="Word64LE">978432</FileSize>
      <Reserved0 himxml:type="LongWord">0</Reserved0>
      <Reserved1 himxml:type="LongWord">0</Reserved1>
      <FileName himxml:type="WideCharArray">Test.exe</FileName>
      <Alternate himxml:type="WideCharArray"/>
    </Data>
  </TestRec>
</xml>

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml>
  <TestRec>
    <Time>998079912</Time>
    <Size>978432</Size>
    <Attr>8224</Attr>
    <Name>Test.exe</Name>
    <Exclude>0</Exclude>
    <Handle>4294967295</Handle>
    <Data>
      <Attributes>8224</Attributes>
      <Creation>129031275541718750</Creation>
      <LastAccess>129039795155312500</LastAccess>
      <LastWrite>129039795155312500</LastWrite>
      <FileSize>978432</FileSize>
      <Reserved0>0</Reserved0>
      <Reserved1>0</Reserved1>
      <FileName>Test.exe</FileName>
      <Alternate/>
    </Data>
  </TestRec>
</xml>

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml>
  <TestRec>
    <rec:0>998080983</rec:0>
    <rec:1>978432</rec:1>
    <rec:2>8224</rec:2>
    <rec:3>Test.exe</rec:3>
    <rec:4>0</rec:4>
    <rec:5>4294967295</rec:5>
    <rec:6>
      <rec:0>8224</rec:0>
      <rec:1>129031275541718750</rec:1>
      <rec:2>129039812850781250</rec:2>
      <rec:3>129039812850781250</rec:3>
      <rec:4>978432</rec:4>
      <rec:5>0</rec:5>
      <rec:6>0</rec:6>
      <rec:7>Test.exe</rec:7>
      <rec:8/>
    </rec:6>
  </TestRec>
</xml>
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat