|
Antwort |
wollt eigentlich nur mal die ersten Fortschritte eines vor kurzem längerem begonnen Projektes vorstellen
es ist "nur" eine weitere kleine XML-Klasse. der Grund war eigentlich, daß mir andere XML-Projekte zu rießig sind und MSMXL (TXMLDocument) nicht grad schnell. [info] aktuell entwickle ich unter D2009 und direkt kompatibel düfte es bis Delphi 2006 / Turbo Delphi sein und Aufgrund einiger Anfragen versuch ich, sobald es da "gut" läuft, eine Extraversion weiter abwärtskompatibel zu machen ... mal sehn, bis wie weit runter das geht [/info] [add 04.01.2001] aktuell sieht es so aus, als wenn es schonmal bis zu D7 läuft [add/] aktueller Post: http://www.delphipraxis.net/internal...116416#1116416 #193
ansonsten bin ich für Tipps und Vorschläge dankbar [add 13.03.2009] ach ja falls der Name jemandem nich gefällt ... Beschwerden bitte an Matze richten [add] im Beitrag #193 wird etwas über die im Download mit enthalenen anderen XML-Libs geschrieben. [add] Achtung, beim Forenupgrad der DP sind die Dateikommentare verschwunden und die Dateinamen sind unglücklich importiert wurden. himxml_246.7z = v0.9 21.05.2009 himxml_164.7z = v0.99d 12.01.2010 other.7z = 30.12.2010 (only the "other" directory)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat, wird PoSex im Delphi viel seltener praktiziert. Geändert von himitsu (30. Dez 2010 um 09:29 Uhr) |
Delphi 2009 Professional |
#141
Ach ich dachte nicht das CData ein eigener Node ist. Danke
MfG xZise
Fabian
|
Zitat |
Delphi 10.2 Tokyo Enterprise |
#142
Ich habe ein seltsames Problem.
Und zwar bekomme ich unter Linux (Wine) immer eine Zugriffverletzung (Runtimer error 216) wenn in einem Project deine XML lib drin ist, sie muss auch nur eingebunden sein um das zu verursachen.. Was kann das sein.
Frank
|
Zitat |
Delphi 12 Athens |
#143
Dann wird es wohl ein Problem in der Initialisierung sein.
Da ich kein Linux bei mir und auch keine Erfahrungen mit Wine hab... Könntest du es irgendwie debuggen? Da es schon alleine beim Einfügen probleme gibt, dürfte das Problem wohl in der Prozedur TXMLFile.Initialize (in himXML.pas) zu suchen sein. Dort werden im Problemfall einige Windows Funktionen verwendet. Von den dort verwendeten Funktionen sollten TRTLCriticalSection, CopyMemory, ZeroMemory und CompareMem wohl keine Probleme machen und auch unter Wine laufen CharLowerBuffW dürfte hottendlich auch keine Probleme machen, aber wenn es da Probleme beim Unicode (also bei den konvertierten Zeichen) gibt, wird versucht eine Log-Datei auf dem Desktop anzulegen, wofür SHGetSpecialFolderLocation, SHGetPathFromIDList, CoTaskMemFree verwendet wird (um den Desktop zu finden). Vielleicht weiß ja wer, ob es mit einigen der genannten Funktionen Probleme gibt. Die Zugriffsverletzung könnte ja darauf hindeuten, daß es z.B. beim AssignFile oder schon bei der Ermittlng des Desktop-Verzeichnisses irgendwas nicht stimmt. (schon klar, da Linux ja 'nen anderen Ordneraufbau hat ... und ich schreibe ja für Windows ) *überleg* ich versuch mal ein kleines Testprojekt zu basteln, wird aber noch ein paar Minütchen dauern. [add] im Anhang ein Testprojekt - ist 'ne Konsolenanwendung, welche nur die Initialisierung enthält [add] ansonten kann ich nur erwähnen ... ich weiß aber nicht, wie lande ich noch benötigt ... daß ich fast das ganze Projekt grad umstelle und viele stellen überarbeite bzw. neu schreibe. Das Interface der meißten Klasse bleibt aber soweit erhalten und es sollten demnach in der Verwendung keine großen Änderungen geben (hoff ich mal) |
Zitat |
Delphi 10.2 Tokyo Enterprise |
#144
Das ist das Ergebnis
:1 :2 :3 :4 :5 Exception: Initialize 1
Frank
|
Zitat |
Delphi 12 Athens |
#145
Hallo himitsu,
kannst Du abschätzen, ob und wann Du es noch für eine D7 verfügbar machen kannst? Danke+Gruß, Christoph |
Zitat |
Delphi 12 Athens |
#146
Also das mit dem Wine war es dann erstmal (in der aktuellen Version werde ich das nicht mehr ändern)
werde aber versuchen es in Nächsten zu umgehen Der Fehler tritt also hier auf und das weißt das woll auf eine kranke/bescheuerte/defekte UnicodeTabelle seiten Linux oder Wine hin. Genauer gesagt auf eine Doppel/-belegung oder anders ausgerückt Groß- und Kleinschreibung stimmen nicht überein.
Delphi-Quellcode:
// copy uppercase chars + check for lower/upper collisions + create check char list
// + fill non-upper/lower chars (#0) For C := Low(Chars) to High(Chars) do Begin If Chars2[C] <> C Then If Chars[C] = 0 Then Chars[C] := Chars2[C] Else Raise Exception.Create('Initialize 1'); Chars2[C] := C; If Chars[C] = 0 Then Chars[C] := C; End; Aber nochmal zu dem Runtimfehler 216: hast du die SysUtils vor himXML in dein Projekt eingefügt, oder erst danach, bzw. garnicht? Und das mit dem Delphi 7 werd' ich dann sehn, aber jedenfalls werden (wenn es denn klappt) dort einige Funktionen verschwinden, da ich nicht alles so umschreiben kann/will, daß es dann auch da läuft (das wäre einfach zuviel Aufwand). |
Zitat |
Delphi 10.2 Tokyo Enterprise |
#147
SysUtils ist als erstes im Project
P.S. wenn ich disen Block raus nehme läuft alles
Frank
|
Zitat |
Delphi 12 Athens |
#148
Zitat von franktron:
P.S. wenn ich disen Block raus nehme läuft alles
und ohne diese die Stringvergleiche nicht mehr richtig arbeiten. Ausdiesem Grunde wird ja auch in dieser Init-Prozedur so viel Verglichen und vorallem kontrolliert, da es sonst zu unvorhersehbaren Problemen kommen kann, wenn die Vergleichstabellen fehlerhaft sind. Daß heißt ich muß erstmal eine alternative schaffen, da die Unicode-Tabelle definitiv defekt ist und sich auf diesen Wege da also nix machen läßt. Das Einzige, welches du solange machen kannst, wäre zumindestens die fehlerhalften Werte zu übernehmen, dann läuft dann wenigstens ein Großteil noch,
Delphi-Quellcode:
aber wenn du dann eines der fehlerhaften Zeichen in deinen Texten hast (wie z.B. im Node-Text oder den Node-/Attribut-Namen), dann beschwere dich bitte nicht, wenn dort dann z.B. Einiges nicht gefunden wird oder es andersweitige Vergleichsprobleme gibt.
If Chars[C] = 0 Then Chars[C] := Chars2[C]
;//Else Raise EXMLException.CreateEx(.... |
Zitat |
Delphi 12 Athens |
#149
OK, hier mal eine Protierung der neuen Prozedur (ich hoffe es läuft auch so)
Delphi-Quellcode:
> hab nur die wichtigen Teile rübergezogen und in die alte Initprozedur eingefügt
.
Class Procedure TXMLFile.Initialize; Procedure OpenLog(Var F: TextFile); Var i: Integer; PIDL: Pointer; Path: Array[1..MAX_PATH] of Char; Begin If Succeeded(SHGetSpecialFolderLocation(0, 0{CSIDL_DESKTOP}, PIDL)) Then Begin If SHGetPathFromIDList(PIDL, @Path) Then Begin Try i := Length(ParamStr(0)); While (i > 0) and (ParamStr(0)[i] <> '\') do Dec(i); AssignFile(F, String(PChar(@Path)) + '\' + Copy(ParamStr(0), i + 1, 888) + '.log'); Try {$i+} Rewrite(F); Except Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [3]); End; Finally CoTaskMemFree(PIDL); End; End Else Begin CoTaskMemFree(PIDL); Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [2]); End; End Else Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [1]); End; Const toHex: Array[0..15] of Char = '0123456789ABCDEF'; Var Chars, Chars2: Array[Word] of Word; C: Word; F: TextFile; i: Integer; Begin __DefaultOptions := XMLDefaultOptions; __DefaultTextIndent := ' '; __DefaultLineFeed := sLineBreak; __DefaultValueSeperator := '='; __DefaultValueQuotation := '"'; __PathDelimiter := '\'; InitializeCriticalSection(__ArrC_Lock); // create lower char list ZeroMemory(@Chars, SizeOf(Chars)); For C := Low(Chars) to High(Chars) do Chars2[C] := C; CharLowerBuffW(@Chars2, Length(Chars)); // copy lower blocks CopyMemory(@__LowerBlock0, @Chars2[Low(__LowerBlock0)], SizeOf(__LowerBlock0)); CopyMemory(@__LowerBlock1, @Chars2[Low(__LowerBlock1)], SizeOf(__LowerBlock1)); CopyMemory(@__LowerBlock2, @Chars2[Low(__LowerBlock2)], SizeOf(__LowerBlock2)); CopyMemory(@__LowerBlock3, @Chars2[Low(__LowerBlock3)], SizeOf(__LowerBlock3)); CopyMemory(@__LowerBlock4, @Chars2[Low(__LowerBlock4)], SizeOf(__LowerBlock4)); CopyMemory(@__LowerBlock5, @Chars2[Low(__LowerBlock5)], SizeOf(__LowerBlock5)); CopyMemory(@__LowerBlock6, @Chars2[Low(__LowerBlock6)], SizeOf(__LowerBlock6)); CopyMemory(@__LowerBlock7, @Chars2[Low(__LowerBlock7)], SizeOf(__LowerBlock7)); CopyMemory(@__LowerBlock8, @Chars2[Low(__LowerBlock8)], SizeOf(__LowerBlock8)); CopyMemory(@__LowerBlock9, @Chars2[Low(__LowerBlock9)], SizeOf(__LowerBlock9)); CopyMemory(@__LowerBlockA, @Chars2[Low(__LowerBlockA)], SizeOf(__LowerBlockA)); // copy lowercase chars For C := Low(Chars) to High(Chars) do Begin If Chars2[C] <> C Then Chars[C] := Chars2[C]; Chars2[C] := C; End; // create upper char list For C := Low(Chars) to High(Chars) do Chars2[C] := C; CharUpperBuffW(@Chars2, Length(Chars)); // copy uppercase chars + check for lower/upper collisions + create check char list // + fill non-upper/lower chars (#0) For C := Low(Chars) to High(Chars) do Begin If Chars2[C] <> C Then If Chars[C] <> 0 Then Begin __CompareBlock0[Low(__CompareBlock0)] := #0; OpenLog(F); Try WriteLn(F, '>>> himXML - initialize error <<<'); WriteLn(F, 'please contact the software distributor'); WriteLn(F, 'file:'); WriteLn(F, ' ', ParamStr(0)); WriteLn(F, 'date:'); WriteLn(F, ' ', DateTimeToStr(Now)); WriteLn(F, 'info:'); WriteLn(F, ' C = #', Ord(C)); WriteLn(F, ' Chars2[C] = #', Ord(Chars2[C])); WriteLn(F, ' Chars[C] = #', Ord(Chars[C])); WriteLn(F); WriteLn(F, '*end*'); Finally CloseFile(F); End; Exit; End Else Chars[C] := Chars2[C]; Chars2[C] := C; If Chars[C] = 0 Then Chars[C] := C; End; // copy upper/lower blocks CopyMemory(@__CompareBlock0, @Chars[Low(__CompareBlock0)], SizeOf(__CompareBlock0)); CopyMemory(@__CompareBlock1, @Chars[Low(__CompareBlock1)], SizeOf(__CompareBlock1)); CopyMemory(@__CompareBlock2, @Chars[Low(__CompareBlock2)], SizeOf(__CompareBlock2)); CopyMemory(@__CompareBlock3, @Chars[Low(__CompareBlock3)], SizeOf(__CompareBlock3)); CopyMemory(@__CompareBlock4, @Chars[Low(__CompareBlock4)], SizeOf(__CompareBlock4)); CopyMemory(@__CompareBlock5, @Chars[Low(__CompareBlock5)], SizeOf(__CompareBlock5)); CopyMemory(@__CompareBlock6, @Chars[Low(__CompareBlock6)], SizeOf(__CompareBlock6)); CopyMemory(@__CompareBlock7, @Chars[Low(__CompareBlock7)], SizeOf(__CompareBlock7)); CopyMemory(@__CompareBlock8, @Chars[Low(__CompareBlock8)], SizeOf(__CompareBlock8)); CopyMemory(@__CompareBlock9, @Chars[Low(__CompareBlock9)], SizeOf(__CompareBlock9)); CopyMemory(@__CompareBlockA, @Chars[Low(__CompareBlockA)], SizeOf(__CompareBlockA)); // "delete" upper/lower blocks from char list CopyMemory(@Chars2[Low(__CompareBlock0)], @__CompareBlock0, SizeOf(__CompareBlock0)); CopyMemory(@Chars2[Low(__CompareBlock1)], @__CompareBlock1, SizeOf(__CompareBlock1)); CopyMemory(@Chars2[Low(__CompareBlock2)], @__CompareBlock2, SizeOf(__CompareBlock2)); CopyMemory(@Chars2[Low(__CompareBlock3)], @__CompareBlock3, SizeOf(__CompareBlock3)); CopyMemory(@Chars2[Low(__CompareBlock4)], @__CompareBlock4, SizeOf(__CompareBlock4)); CopyMemory(@Chars2[Low(__CompareBlock5)], @__CompareBlock5, SizeOf(__CompareBlock5)); CopyMemory(@Chars2[Low(__CompareBlock6)], @__CompareBlock6, SizeOf(__CompareBlock6)); CopyMemory(@Chars2[Low(__CompareBlock7)], @__CompareBlock7, SizeOf(__CompareBlock7)); CopyMemory(@Chars2[Low(__CompareBlock8)], @__CompareBlock8, SizeOf(__CompareBlock8)); CopyMemory(@Chars2[Low(__CompareBlock9)], @__CompareBlock9, SizeOf(__CompareBlock9)); CopyMemory(@Chars2[Low(__CompareBlockA)], @__CompareBlockA, SizeOf(__CompareBlockA)); // check for chars out of upper/lower blocks If not CompareMem(@Chars, @Chars2, SizeOf(Chars)) Then Begin __CompareBlock0[Low(__CompareBlock0)] := #0; OpenLog(F); Try WriteLn(F, '>>> himXML - initialize error <<<'); WriteLn(F, 'please contact the software distributor'); WriteLn(F, 'file:'); WriteLn(F, ' ', ParamStr(0)); WriteLn(F, 'date:'); WriteLn(F, ' ', DateTimeToStr(Now)); WriteLn(F, 'chars:'); For C := Low(Chars) to High(Chars) do If Chars[C] <> Chars2[C] Then Begin Write(F, ' '); For i := 3 downto 0 do Write(F, toHex[(C shr (i * 4)) and $0F]); Write(F, ' [', C:5, ']: '); For i := 3 downto 0 do Write(F, toHex[(Ord(Chars[C]) shr (i * 4)) and $0F]); Write(F, ' '); For i := 3 downto 0 do Write(F, toHex[(Ord(Chars2[C]) shr (i * 4)) and $0F]); WriteLn(F); End; WriteLn(F); WriteLn(F, '*end*'); Finally CloseFile(F); End; End; End; > und konnte es jetzt noch nicht testen |
Zitat |
Delphi 12 Athens |
#150
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:
und macht aus dem
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;
XML-Code:
dieses hier
<?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>
Code:
(eine 29 MB-Datei wird bei mir innerhalb von 2375 ms in die StringListe eingelesen)
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 < 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) |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Erstellt von | For | Type | Datum |
xml - MSXML alternative - Stack Overflow | This thread | Refback | 28. Jun 2011 16:34 |
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |