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)