AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte himXML (gesprochen himix ML)
Thema durchsuchen
Ansicht
Themen-Optionen

himXML (gesprochen himix ML)

Ein Thema von himitsu · begonnen am 12. Mär 2009 · letzter Beitrag vom 11. Nov 2020
Antwort Antwort
Seite 9 von 26   « Erste     789 101119     Letzte »    
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 29. Mai 2009, 12:39
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
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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 1. Jun 2009, 15:48
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
  • 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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

Re: himXML (gesprochen himixML)

  Alt 3. Jun 2009, 19:38
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: himXML (gesprochen himixML)

  Alt 4. Jun 2009, 14:31
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 4. Jun 2009, 14:50
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#6

Re: himXML (gesprochen himixML)

  Alt 4. Jun 2009, 14:57
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)
XML.RootNode.Nodes.Exists('Section_1\SubSect_1\SubSubSect_1\Value_1') Funktioniert!

Ja peinlich, eine vorhandene Funktion übersehen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 4. Jun 2009, 15:21
du kannst dir ja mal in Ruhe die Interfaces-Abteilung in himXMLi.pas durchsehn


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 ( .Node['node1\node2[3]'] )

[edit]
hab grad gemerkt, das GetNextFromPos ja den Pfad zerlegt und nur den Namen liefert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 11. Jun 2009, 17:47
Neu:
Post #1
  • es kann direkt eine Inline-Verschlüsselung genutzt werden
    einfach für den gewünschten Knoten zusweisen und alles via .Text und .Text_S wird automatisch beim Zuweisen/Auslesen ver-/entschlüsselt
    Delphi-Quellcode:
    Node.Crypted := '*'; // Standardverschlüsselung nutzen (erstes in der Liste)
    Node.Crypted := 'RC4'; // RC4 verwenden
    Node.Text := X; // zuweisen und automatisch verschlüsseln
    X := Node.Text; // automatisch entschlüsseln und auslesen
    If Node.Crypted <> 'Then // nur prüfen ob es verschlüsselt ist
    If Node.Crypted = 'RC4Then // prüfen ob es RC4 verschlüsselt ist

    XML.CryptData['RC4'] := S; // anderen Key für RC4 festlegen
    da die Verschlüsselungsroutine Zugriff auf die Node-Attribute hat, könnte man auch eine eigene Verschlüsselung zuweisen, welche z.B. über ein weiteres Attribut jeden Node mit einem eigenem Key verschlüsselt.
    Delphi-Quellcode:
    XML.Cryptors // listet alle registrierten Verschlüsselungen auf
    XML.SetCryptor // setzt/lösche eine Verschlüsselung
    XML.CryptProc // siehe SetCryptor
    XML.CryptData // siehe SetCryptor
    XML.CryptAttrName // der Name des Attributes, welcher die aktive Verschlüsselung enthält


Und dann hab ich noch einen bösen Fehler in der Base64-Codierung entdeckt
bei der letzen Typenumstellung wurde die Zählweise nicht angepaßt und so kam nicht das raus, was rauskommen sollte und es konnten auch mal nette Exceptions auftauchen, da Pufferüberlauf entstand.
z.B.
alt: Inc(Pv, 3);
neu: Inc(Pv);

früher war es ein Bytearray über den gesamten String, jetzt ist z.B. Pv nur noch ein Zeiger auf Array[0..2] of Byte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: himXML (gesprochen himixML)

  Alt 13. Jun 2009, 20:50
Hallo,

leider hab' ich ein paar Probleme zu berichten:

1)

Programme mit eingebundener himXML-Unit brechen unter Windows 7 RC sofort ab. Die neuesten Demo-Binaries einfach so (scheinbar wegen Console), mein VCL-Testprogramm mit Runtime-Error 217.

Dabei konnte ich es so weit runter reduzieren, das alleine das Einbinden der Unit himXML ausreicht (ohne irgend ein .create). Der Fehler liegt also im Initialization-Teil der Unit. Da ich unter Windows 7 RC noch keine BDS Umgebung hab', kann ich leider nicht mit genaueren Informationen dienen. Wenn Du kein Win7 zu Testen hast, gib kurz Bescheid und ich installiere dann ein BDS unter Win7 um es genauer definieren zu können.

2)

Die neueste hier gepostete Version lässt sich nicht mehr unter TDE2006 kompilieren. Besitze inzw. zwar auch BDS 2007, aber bis TDE 2006 abwärts wollte zumindest ich noch eine abwärts Kompatibilität (muss nicht zwingend Dein Anliegen sein)

Die erste Fehler-Meldung beim compilieren:
[Pascal Fehler] himXML.pas(1702): E2251 Doppeldeutiger überladener Aufruf von 'CreateEx'
bei Zeile 1702 [himXML]:
If (L < 0) or (i > 0) Then Raise EXMLException.CreateEx(nil, 'Crypt_Base64Decode', @SCorupptedBase64);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: himXML (gesprochen himixML)

  Alt 13. Jun 2009, 21:35
och, 2) ist leicht zu beheben

ersetze einfach mal das nil durch TXMLFile

zu 1)
hab grad kein Win7 installiert

im Anhang hab ich mal eine kleine Log-Funktion in die Init-Prozedur eingebaut
> erstellt eine CheckLibs.exe.log im Programmverzeichnis

[add]
217 = reControlBreak
hab ich da einen übersehn?
[add2]
nee, nix zu finden (der Einzige ist auskommentiert)

[edit]
Anhang entfernt ... braucht ja nun keiner mehr
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 9 von 26   « Erste     789 101119     Letzte »    


Forumregeln

Es 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

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
xml - MSXML alternative - Stack Overflow This thread Refback 28. Jun 2011 15:34

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz