Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

Re: himXML (gesprochen himix ML)

  Alt 10. Sep 2009, 14:11
Ich glaub mein neuer XML-Reader ist fast fertig.

Hab das Parsen der Datei aus TXMLFile rausgelöst und werde die nächsten Tage in die anderen Klassen dann den Reader einbinden ... somit haben dann alle Klassen (vorallem TXMLFile und TSAXFile) den selben Parser im Hintergrund und nicht jeder seine eigene Version.

Dieser parst allerdings nur die Datei und ihn interessiert die Verschachtelung überhaupt nicht.

Im Ganzen hochladen kann/möchte ich das Projekt jetzt nicht, da dort noch zuviel nicht wieder geht bzw. einfach schlimm aussieht.

Die EXE im Anhang enthält diesen Code
Delphi-Quellcode:
Var C: LongWord;
  S: WideString;
  R: TXReader;
  F: TStream;
  SL: TStringList;

C := GetTickCount;
S := '';
F := TFileStream.Create('test.xml', fmOpenRead);
R := TXReader.Create(F, [], #13#10);
SL := TStringList.Create;
Try
  While R.Parse do Begin
    Case R.DataType of
      xdInstruction: Begin
                        SL.Add(S + 'xdInstruction: Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdTypedef: Begin
                        SL.Add(S + 'xdTypedef: Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdElement: Begin
                        SL.Add(S + 'xdElement: Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdCData: Begin
                        SL.Add(S + 'xdCData: Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdComment: Begin
                        SL.Add(S + 'xdComment: -');
                        Insert(' ', S, 1);
                      End;
      xdAttribute: SL.Add(S + 'xdAttribute: Name="' + R.Name + '" Value="' + R.Value + '"');
      xdEndAttribute: SL.Add(S + 'xdEndAttribute: -');
      xdText: SL.Add(S + 'xdText: Value="' + R.Value + '"');
      xdClose: Begin
                        Delete(S, 1, 2);
                        SL.Add(S + 'xdClose: Name="' + R.Name + '"');
                      End;
      xdCloseSingle: Begin
                        Delete(S, 1, 2);
                        SL.Add(S + 'xdCloseSingle: -');
                      End;
    End;
    If GetTickCount - C > 15000 Then Begin
      SL.Add('> TimeOut <');
      Break;
    End;
  End;
  SL.Add('> ' + IntToStr(GetTickCount - C) + ' ms <');
  //Memo1.Lines.Assign(SL);
  Memo1.Lines.BeginUpdate;
  Try
    c := GetTickCount;
    i := 0;
    While i < SL.Count do Begin
      Memo1.Lines.Add(SL[i]);
      If (GetTickCount - C > 45000) and (i + 20 < SL.Count) Then Begin
        Memo1.Lines.Add('');
        Memo1.Lines.Add('...');
        Memo1.Lines.Add('');
        For i := SL.Count - 20 to SL.Count - 1 do
          Memo1.Lines.Add(SL[i]);
        Break;
      End;
      Inc(i);
    End;
  Finally
    Memo1.Lines.EndUpdate
  End;
Finally
  SL.Free;
  R.Free;
  F.Free;
End;
und macht aus dem
XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="selfxml.xsl" type="text/xsl" ?>
<Programm>
  <Information>
    <Name>Hans Wurst</Name>
    <Datum>01.10.2009</Datum>
  </Information>
</Programm>
dieses hier
Code:
xdInstruction:  Name="xml"
  xdAttribute:  Name="version"  Value="1.0"
  xdAttribute:  Name="encoding"  Value="ISO-8859-1"
xdCloseSingle:  -
xdInstruction:  Name="xml-stylesheet"
  xdAttribute:  Name="href"  Value="selfxml.xsl"
  xdAttribute:  Name="type"  Value="text/xsl"
xdCloseSingle:  -
xdElement:  Name="Programm"
  xdEndAttribute:  -
  xdElement:  Name="Information"
    xdEndAttribute:  -
    xdElement:  Name="Name"
      xdEndAttribute:  -
      xdText:  Value="Hans Wurst"
    xdClose:  Name="Name"
    xdElement:  Name="Datum"
      xdEndAttribute:  -
      xdText:  Value="01.10.2009"
    xdClose:  Name="Datum"
  xdClose:  Name="Information"
xdClose:  Name="Programm"
> 0 ms <
(eine 29 MB-Datei wird bei mir innerhalb von 2375 ms in die StringListe eingelesen)

falls wer zufällig erkennt, daß da bei seinen Dateien (es wird eine Datei Namens "test.xml" im Programmverzeichnis geladen) irgendwas nicht stimmen kann, so möge er/sie sich bitte melden.

[edit]
ich merk grad, daß bei Kommentaren und Dergleichen der Text falsch gelesen wird
[edit2]
ich hoff der Fehler ist jetzt behoben
[edit3]
die Gesamtlaufzeit ist auf eine Minute begrenzt wurden
maximal 15 Sekunden Lesen und 45 Sekunden zum füllen des Memos (nicht daß das Programm "ewig" läuft)
Angehängte Dateien
Dateityp: exe test_674.exe (874,0 KB, 4x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat