Delphi-PRAXiS
Seite 7 von 35   « Erste     567 8917     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   himXML (gesprochen himix ML) (https://www.delphipraxis.net/130751-himxml-gesprochen-himix-ml.html)

himitsu 28. Mai 2009 09:18

Re: himXML (gesprochen himixML)
 
kleine Zwischeninfo:

bin grad dabei alles auf Interfaces umzustellen und die Verwaltung selber läuft erstmal recht gut
(auch wenn wegen der zwischengeschalteten Interfaces aktuell alles 2 bis 4 Mal langsamer ist)

allerdings wird alles über Kompilerschalter geregelt, so daß sich alles als Objekte oder mit Interfaces kompilieren läßt und so beide Möglichkeiten erhalten bleiben.

dann ist auch schon eine erste Version als DLL soweit fertig.
diese läßt sich aber aktuell nur mit der Interfaceversion nutzen ... mal sehn ob ich es wieder (hatte es anfangs mal mit Objekten, bevor ich mit den Interfaces anfing).

bei den Interfaces hab ich aber aktuell noch ein rießiges Problem :?
und zwar Aufgrund Kreuzreferenzen klappt was mit der Freigabe nicht.
- wenn ich den Standard von IInterface und TInterfacedObject als Basis nutze, dann wird nie etwas freigegeben
- und bei meinem aktuellen Selbst-Versuch da was brauchbares hinzubekommen, wird manchmal was zu früh oder ebenfalls nie freigegeben
> es wird also noch etwas mit den Interfaces und der DLL (diese sollte sich dann auch direkt mit älteren Delphi-Versionen nutzen lassen und der Delphi-Speichermanager der Anwendung wird automatisch in die DLL umgeleitet, so daß es dann bezüglich der Strings und anderen Dingen keine Probleme geben dürfte :angel: )

ja und da drüben hab ich noch ein paar Probleme mit anderen XML-Libs

[add]
Anhang, mit den öffentlichen Interfaces, drangehängt (so als Einblick)

[edit 01.06.2009]
Anhang entfernt (taucht beim nächten Update im ersten Post auf)

himitsu 28. Mai 2009 21:47

Re: himXML (gesprochen himixML)
 
den kranken Härtetest mußte ich grad aufgeben

hab mal versucht Seiten der DP zu parsen :lol:

aber bei sovielen Fehlern ... allerdings nicht im Parser ... unmöglich

OK, daß ich die Seitenquelltexte erstmal per Hand (mit Notepad :nerd: ) in UTF-8 umwandeln und das eine Javascript in einen Kommentar einschließen mußte (da dort ein < drin vorkam) war ja zu verkraften, aber die vielen Syntaxfehler hier :shock:

von der PN-Inbox: schließendes span zuviel
Code:
Markierungen aufheben</a></span>
[b]</span>[/b]
und die Startseite ... tssss, wie kann man ein <a> nicht abschließen?
Code:
<td align="center" class="cc41">
  <a href="http://www.delphi-tage.de" title="Delphi-Tage 2009" target="_blank">[img]./images/dt2009/dt09logo150px2.gif[/img]
</td>
und dann ging es imer so weiter...

zum Glück sind in Webbrowsern sehr fehlerresistente Parser drin :angel2:

sh17 29. Mai 2009 06:02

Re: himXML (gesprochen himixML)
 
Oh oh

himitsu 29. Mai 2009 12:39

Re: himXML (gesprochen himixML)
 
mit dem nächsten "offiziellem Update dauert es noch etwas, da noch zuviel nicht ganz umgestellt und getstet ist.

in das Testprojekt (CheckLips.dpr) hab ich inzwischen auch mal versucht XercesXML, OpenXML, SimpleXML und OmniXML reinzubekommen.

SimpleXML läuft, auch wenn es nicht so Simpel war, wie es klingt :shock:
Außerdem mußte ich erstmal etwas bearbeiten, da es nichtmal kompilierbar war
- in OctetToChars mußte LongWord(pc^) durch PLongWord(pc)^ ersetzt werden (pc=PChar)
- dann läuft es unter D2009 zwar, ist aber bei weitem nicht unicodefähig (einige Funktionen arbeiten falsch)

XercesXML und OpenXML laufen garnicht

OmniXML ... läuft vermutlich, wenn ich mal rausbekomm wie man da Nodes erstellt und vorallem auch noch einfügt, ohne eine Exception zu verursachen :?


ja und dann hab ich den dateiinternen Hilfetext nach himXMLi.pas verschoben, wo nun auch die wichtigsten Typen und Header in Form von Interfaces liegen (dürfte dum ansehn des Funktionsumfanges und der gebotenen Funktionalitäten da drüben übersichtlicher sein)

und ich hab fast alles (an Schnittstellen) so umgestellt, daß es für die Nutzung als Interfaces oder Objecte nutzbar ist (jenachdem in welchem Modus himXML kompiliert ist ... aktuell läuft aber nur der Object-Modus, da intern noch Vieles unfertig ist)

da himXML beim Parsen nur die Byteposition und ein Stückchen des Codes anzeigt, wo ein Fehler auftrat, ist in der Tree_Demo ein kleiner "billiger" Code drin, um dieses in die Zeilenangabe umzurechnen, aber ich werd da vermutlich irgendwann mal Etwas direkt integrieren, daß die Zeilen mitgezählt und angezeigt werden.

[edit 01.06.2009]
Anhänge entfernt (tauchen beim nächten Update im ersten Post auf)

himitsu 1. Jun 2009 15:48

Re: himXML (gesprochen himixML)
 
hab das Projekt mal ein klein wenig aufgeräumt ...
mit immer mehr zusätzlichen Test-/Zusatzdateien wurde es in dem einem Verzeichnis langsam unübersichtlich

TSAXFile (früher TSAXParser) hat einen bekannten Bug
und zwar zählt die Levelindizierung falsch, weswegen in der zugehörigen Demo kein Ergebnis angezeigt wird.
(hab es jetzt nicht in der Demo so hingebogen, daß es da läuft, sondern werd' demächst die Parser-Funktion eh überarbeiten und mit der neuern Verson von TXMLFile abgleichen)

die letzen Änderungen
  • der Text im Post #1 wurde auch mal geupdatet
  • Erste Schritte in Richtung Abwärtskompatibilität wurden gewagt.
    - seit Einführung der Interfaces war das Projekt nichtmal mehr für D2006/TDE geeignet
    (siehe erwähntes Property-Problem in Post #1)
  • und theoretisch sollte sich die aktuelle Version auch bald als DLL-Version in älteren Delphi-Versionen nutzen lassen :angel2:
  • TSAXParser in TSAXFile umbenannt (passend zu TXMLFile)
  • die öffentlichen Interfaces, wichtigsten Typen, sowie die "Hilfe" wurden in himXMLi.pas ausgelagert
  • hab auch die ganzen Interfaces etwas aufgeräumt/sortiert und vorallem die unterschiedliche Definitionen in den einzelnen Dateien auf einen einheitlichen Stand gebracht
  • .Data der Nodes wurde in .Text umbenannt
  • die Weiterleitungen in TXMLNode wurden überarbeitet
    und ebenso in das Hauptdokument eingefügt
    Delphi-Quellcode:
    alias         TXMLNode              TXMLFile

    .Attribute[]  .Attributes.Values[]  .RootNode.Attributes.Values[]
                   .Attributes[]         .RootNode.Attributes[]
    .Node[]       .Nodes.Node[]         .RootNode.Nodes.Node[]
                   .Nodes[]              .RootNode.Nodes[]
    .NodeNF[]     .Nodes.NodeNF[]       .RootNode.Nodes.NodeNF[]
    .NodeList[]   .Nodes.NodeList[]     .RootNode.Nodes.NodeList[]
    .NodeListNF[] .Nodes.NodeListNF[]   .RootNode.Nodes.NodeListNF[]
    .AddNode()    .Nodes.Add()          .RootNode.Nodes.Add()
  • hab das ganze Projekt so geändert, daß alles als virtielle Objekte, Interfaces oder "Normal" kompiliert werden kann
  • für D2006/TDE und auch schon für ältere Versionen wurde TIndex, sowie die überladenen Default-Properties abschaltbar gestaltet

    also es läuft jetzt auch wieder unter TDE ... dieses kannte leider noch keine überladenen Default-Properties bei Interfaces
  • das Property LibVersion wurde in die Hauptklassen eingefügt und liefert ab nun die Version der Klassen
  • das Property PathDelimiter kam hinzu, jetzt kann die Pfadangabe in Windows- (\) oder Linux-Stil (/) erfolgen
  • passend dazu kam das Property FullPath hinzu, welches den Pfad des Nodes liefert
  • LoadFromFile und SaveToFile nutzen den Dateinamen aus dem Property FileName (dieses kann direkt beschrieben werden oder wird von LoadFromFile/SaveToFile gesetzt), wenn kein Dateiname angegeben wude,
    außerdem kann jetzt direkt mit .Create eine Datei geladen werden
  • ja und vor 'ner Weile kam halt noch ein "echter" SAXParser mit dazu, welchem die Dateigröße egal ist und der hier mal mit locker 20-30 MB/s die Testdateien einlaß (nicht mitgerechnet die Zeit für die programmseitige Verarbeitung der Daten)
  • ...

Dateien siehe Post #1


aktuelle Probleme:
  • Den Indexfehler in TSAXFile beheben
  • mir endlich mal eine wirklich brauchbare Lösung für die Deserialisierung von Objekten einfallen lassen
  • das große Problem mit der Speicher-/Objektfreigabe bei den Interfaces lösen
    - durch die vielen Kreuz und Rückverknüpfungen nicht so einfach
    - und mit der Standardverwaltung von TInterfacedObject hält sich alles gegenseitig ewig am Leben :stupid:

Satty67 3. Jun 2009 19:38

Re: himXML (gesprochen himixML)
 
Also Compilierung unter TDE2006 problemlos (aller 3 Units).

Nach Search&Replace von .Data -> .Text lief alles sofort. Hab' dann auch die meisten tieferen Methoden durch Aliase ersetzt (dank Übersetzungstabelle).

Das Interface hab' ich noch nicht getestet (bin auch eben am Create gescheitert, als D5-ler muss ich da nochmal kurz drüber nachdenken)

Da ich himXML aktuell "nur" als INIFile-Ersatz verwende, sind meine Test's vielleicht auch nur etwas oberflächlich. Werde am Wochenende mein Übungsprojekt mal stark erweitern, um die mehr Umfang von himXML zu testen (bis dahin bekomme ich das auch mit dem Interface hin).

***

Ich versuche gerade raus zu finden, wie ich elegant ermittel, ob ein Node schon existiert. Dabei ist wichtig, das ich weis, ob der Node vorher schon existierte, da ich einen neuen Node mit einem Default-Wert füllen will.

Das gibt immer einen gültigen Node, weil er gleich angelegt wird
Delphi-Quellcode:
aNode := XML.RootNode.Nodes['Section_1\Value_1'];
// aNode nur NIL, wenn Pfad falsche Zeichen enthält
Das geht nicht
Delphi-Quellcode:
if XML.RootNode.Nodes.IndexOf('Section_1\Value_1') < 0
// Gibt immer -1, da Pfad nicht ausgewertet wird?
Das ist mein aktueller Weg
Delphi-Quellcode:
if XML.RootNode.Nodes['Section_1'].Nodes.IndexOf('Value_1') < 0
// -1 Node existiert nicht, >= 0 wenn Node existiert
(kann ich später Recursiv und mit Explode auf den Pfad eleganter gestalten)

Ja, ich sehe manchmal den Wald vor lauter Bäumen nicht... gibt es eine bessere Variante, einen SubNode auf Existenz zu prüfen?

PS: Falls ich doch richtig liege und es derzeit keine andere Möglichkeit gibt (in der Tools-Unit auch so gelöst)... ein XMLFile.NodeExists('Pfad') wäre auch OK

Satty67 4. Jun 2009 14:31

Re: himXML (gesprochen himixML)
 
Ok, sind keine 24h, aber das jetzt oben rein zu klemmen, wäre doch unübersichtlich:

Prüfen will ich, ob z.B. XML\Section_1\SubSect_1\SubSubSect_1\Value_1 existiert. (Damit ich kein default-Wert lade, falls dort z.B. bereits ein Leerstring als gewünschter Wert gespeichert ist).

Zum Testen lege ich folgende XML-Datei an:
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml>
  <Section_1 methode="with bloecke">
    <Value_1>Section 1 Value 1</Value_1>
    <Value_2>Section 1 Value 2</Value_2>
    <SubSect_1>
      <SubSubSect_1>
        <Value_1>Section 1 SubSect 1 SubSubSect 1 Value 1</Value_1>
      </SubSubSect_1>
    </SubSect_1>
  </Section_1>
</xml>
Dazu folgende Funktion gebastelt, die auch korrekt die Pfad-Abschnitte ausschneidet und prüft (NodeName Zuweisung und ShowMessage() nur zu Prüfzwecken):
Delphi-Quellcode:
function himXML_NodeExists(XML: TXMLFile; NodePath : String): Boolean;

  function GetNextFromPos(var Offset : Integer) : String;
  var
    EndOffset : Integer;
  begin
    EndOffset := PosEx('\', NodePath, Offset);
    Result := Copy(NodePath, Offset, EndOffset - Offset);
    Offset := EndOffset +1;
  end;

var
  Node : TXMLNode;
  i, Offset : Integer;
  NodeName : String;
begin
  Offset := 1;
  Node := XML.RootNode;
  NodePath := IncludeTrailingPathDelimiter(NodePath);
  while (Offset < Length(NodePath)) and (Node <> NIL) do
  begin
    NodeName := GetNextFromPos(Offset);
    i := Node.Nodes.IndexOf(NodeName);
    ShowMessage(NodeName+': '+IntToStr(i));
    if i >= 0 then
      Node := Node.Nodes[i]
    else
      Node := NIL;
  end;
  Result := Node <> NIL;
end;
Nur wird immer ab dem 3. Node für IndexOf(Name) der Wert -1 zurückgegeben. Also alles was tiefer als 2 Ebenen ist, kann ich nicht mehr prüfen (bis Ebene 2 funktioniert es korrekt).

Der komplette "Button" Test-Code hier:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  XML : TXMLFile;
  aNode : TXMLNode;
begin
  XML := TXMLFile.Create(self);

  with XML.RootNode.AddNode('Section_1') do
  begin
    Attributes.Add('methode','with bloecke');
    AddNode('Value_1').Text := 'Section 1 Value 1';
    AddNode('Value_2').Text := 'Section 1 Value 2';
    with AddNode('SubSect_1') do
      with AddNode('SubSubSect_1') do
        AddNode('Value_1').Text := 'Section 1 SubSect 1 SubSubSect 1 Value 1';
  end;

  if himXML_NodeExists(XML, 'Section_1\SubSect_1\SubSubSect_1\Value_1') then
    ShowMessage('Node gefunden')
  else
    ShowMessage('Node nicht definiert');

  xml.SaveToFile('F:\WorkTemp\himXMLtest.xml');
end;
Ich frage mich, ob ich da falsch vorgehe. Im Quellcode von XMLNodeList hab' ich nachtürlich auch geschaut, mich aber in einer Hashliste verheddert und dachte dann, die gewünschte Antwort bekomme ich mit einem Post einfacher :stupid:

himitsu 4. Jun 2009 14:50

Re: himXML (gesprochen himixML)
 
hmmmm, versuch mal
Delphi-Quellcode:
XML.Nodes.Exists('XML\Section_1\SubSect_1\SubSubSect_1\Value_1')

oder

XML.RootNode.Nodes.Exists('Section_1\SubSect_1\SubSubSect_1\Value_1')

was genau in deinem Code abläuft oder nicht, werd ich später mal nachsehn ... hab hier grad noch in paar andere Problemchen :?

Satty67 4. Jun 2009 14:57

Re: himXML (gesprochen himixML)
 
Ups, Du hast ein Exists drin... Sorry, aber ich kann im BDS noch nicht so gut lesen wie in D5 (liegt an mir, nicht am BDS) :oops:
Delphi-Quellcode:
XML.RootNode.Nodes.Exists('Section_1\SubSect_1\SubSubSect_1\Value_1')
Funktioniert!

Ja peinlich, eine vorhandene Funktion übersehen. :)

himitsu 4. Jun 2009 15:21

Re: himXML (gesprochen himixML)
 
du kannst dir ja mal in Ruhe die Interfaces-Abteilung in himXMLi.pas durchsehn :angel:


also ein Problem hab ich schonmal gefunden:

IndexOf nimmt keine Node-Pfade entgegen, hatte ich mal "gesperrt", da es ja nur den Index in Bezug auf den Node (dessen NodeList) enthält, welcher den gesuchten Node enthält und man direkt ja nur über dessen Elternknoten rankam ... nja, aber ich kann die Verarbeitung von NodesPfaden wieder darin einbauen ... jetzt wo man inzwischen auch im Text den Index angeben kann :stupid: ( .Node['node1\node2[3]'] )

[edit]
hab grad gemerkt, das GetNextFromPos ja den Pfad zerlegt und nur den Namen liefert. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
Seite 7 von 35   « Erste     567 8917     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz