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 7 von 35   « Erste     567 8917     Letzte »    
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
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 (Hier im Forum suchenTXMLDocument) 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
  • aktuell ab Delphi 2006 bzw. Turbo Delphi und auch für Delphi2009
    ab Windows 2000 und öfters mal in Windows 7 getestet
  • zu den möglichen unterstützten Delphi-Versionen gibt es, Aufgrund häufiger Nachfragen, in Beitrag #191 eine kleine Zusammenfassung.
  • Lizenzen: MPL v1.1 , GPL v3.0 oder LGPL v3.0
    es sollte also hoffentlich mit vielen anderen Lizenzen kompatibel sein
  • arbeitet weitetgehend nach XML-Standard 1.0 (Fifth Edition)
    und Extensible Markup Language (XML) 1.1 (Second Edition)
  • ist nicht validierend
  • ein einzulesendes Dokument sollte aber möglichst "Well-Formed" (wohlgeformt) sein
  • es wird nur der "Standard" unterstützt ... andere DTDs oder ähnliche Informationen werden nicht unterstützt
  • also <!xyz text> wird zwar ausgelesen, aber "text" wird nicht auswertet
  • <![CDATA[text]]> wird dagen natürlich behandelt
  • <?xyz text ?> wird unterstützt, allerdings wird "text" geparst und in Parameter zerlegt (also wird es Probleme geben falls sich "text" mal nicht in Parameter zerlegen läßt)
    (nach XML 1.0 wird "text" eigentlich nicht zuerlegt im XML-Baum abgelegt, sondern nur XML-Prozessor-intern verarbeitet oder ignoriert)
  • unterstützte Kodierungen (teilweise auch via BOM):
    UTF-7, UTF-8, UTF-16, ISO-10646-UCS-2 (littel endian), Unicode (big endian)
    ISO-8859-1 bis ISO-8859-9, ISO-2022-JP, EUC-JP, SHIFT-JIS und WINDOWS-1250 bis WINDOWS-1258
  • UCS-4 (4 Byte-Unicode) wird nicht unterstützt,
    denn leider kann man immernoch nicht mit UCS4Char und UCS4String richtig arbeiten, vorallem da sie vollkommen inkompatibel zu den anderen Strings sind (bauen intern nur auf LongWord auf, statt auf einen "Char")
  • im Gegensatz zu MSXML (TXMLDocument) kann die Kodierung stärker umgeschaltet werden
    (auch von ANSI/UTF-8 nach Unicode ... MSXML kann z.B. nur umschalten, wenn sich die Zeichengröße in Byte nicht ändert)
  • arbeitet nur mit Klassen
    (eine Variante für sehr große Dateien und mit Interfaces aufgebaut, welche die Dateninhalte vorwiegend direkt in der Datei liest, speichert und ändert, kommt vielleicht irgendwann mal)
  • eine Thread-Absicherung wurde letztendlich doch nicht direkt integriert,
    aber die CriticalSection wurde dringelassen und kann direkt verwendet werden:
    Delphi-Quellcode:
    XML._Lock;
    Try
      ... mach was mit dem XML ...
    Finally
      XML._Unlock;
    End;
  • es muß nur jeweils eine Datei eingebunden werden
    himXML, himXMLi, himXML_UseDLL oder himXML_UseDLLi,
    jenachdem mit welcher Schnittstelle man arbeitet
    > wichtige Typen und Konstanten werden in den Dateien weitergeleitet, falls sie nicht in der entsprechenden Unit definiert sind
  • ein kleiner Benchmark ist aber schon lauffähig:
    Delphi-Quellcode:
    // inklusive Zeitmessung siehe FormCreate

    XML := TXMLDocument.Create(Self);
    XML.Active := True;
    XML.Version := '1.0';
    XML.StandAlone := 'yes';
    XML.Encoding := 'UTF-8';
    XML.Options := [doNodeAutoIndent];
    XML.AddChild('xml');
    For i := 0 to 100000 do XML.DocumentElement.AddChild('Node' + IntToStr(i));
    XML.SaveToFile('test2.xml');
    XML.Free;

    // versus

    XML := TXMLFile.Create(nil);
    For i := 0 to 100000 do XML.RootNode.Nodes.Add('Node' + IntToStr(i));
    XML.SaveToFile('test.xml');
    XML.Free;
    Delphi-Quellcode:
    //10.000 Nodes (ergibt ca. eine 150 KB-Datei)

    TXMLDocument = fill:6749 save:99
    TXMLFile = fill: 10 save: 7

    // 100.000 Nodes (ergibt ca. eine 1,5 MB-Datei)

    TXMLDocument = fill:708145 save:348 load:331
    TXMLFile = fill: 189 save:150 load:319
    Zeiten in Millisekunden

    weitere Tests und Vergleiche (auch mit anderen Libs), siehe demos\CheckLibs.dpr
    wer keine Lust hat, vorallem wegen MSXML 'ne halbe Stunde ein Programm laufen zu lassen ... auf den nächsten Seiten befinden sich sporatisch die Testergebnisse verteilt
  • "wichtige" Grundfunktionen von .RootNode wurden direkt in die Basisklasse (TXMLFile) umgelegt, sowie von .Nodes in dessen Mutterklasse (TXMLNode)

    .Node (.Nodes.Node[], .RootNode.Nodes.Node[] bzw .Nodes[], .RootNode.Nodes[]), .NodeNF (.Nodes.NodeNF bzw. .RootNode.Nodes.NodeNF), .NodeList (.Nodes.NodeList bzw. .RootNode.Nodes.NodeList), .NodeListNF (.Nodes.NodeListNF bzw. .RootNode.Nodes.NodeListNF) und AddNode (.Nodes.Add bzw. .RootNode.Nodes.Add)
    (in Groß siehe Beitrag #65)
  • Pfadangaben sind möglich
    in Kurz also XML['node1\node2'] statt XML.RootNode.Nodes['node1'].Nodes['node2']
    ebenso können Parameter und Indizes im Nodepfad angegeben werden (siehe Hilfesektion in himXMLi.pas)
  • es kann direkt eine Inline-Verschlüsselung genutzt werden
    einfach für den gewünschten Knoden 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
    • himXML.pas
      - die ganzen Klassen
    • himXMLi.pas
      - die zugehörigen Interfaces (sie spiegeln auch die Funktionalität der Klassen wieder .. nur da halt über TXML... statt IXML...)
      - und enthält auch eine "kleine" Hilfe-Sektion
    • himXML_Tools.pas
      - kleine Zusatzmodule:
      TSimpleAssocVariantArray - sehr einfaches String-assoziatives Array of Variant
      TXMLSerializeRecord_Creator - erzeugt eine Record-Definition für .Serialize/.DeSerialize von Records
      TXMLIniFile - verwendet eine XML-Datei wie eine INI und läßt sich auch wie IniFiles.TIniFile nutzen
      TXMLRegistry - das Gleiche, nur halt mit Registry.TRegistry
      TXMLDatabase - noch unfertig, soll aber irgendwann mal eine XML-Datei wie eine kleine SQL-DB nutzbar machen
    • demos\CheckLibs.dpr
      - einige Tests/Benchmarks zum Projekt und anderen XML-Libs
    • demos\CheckLib_UseDLL.dpr und demos\CheckLib_UseDLLi.dpr
      - das Gleiche, nur über ein externes himXML via DLLs (siehe weiter unten)
    • demos\Demo_Serialize.dpr
      - zeigt einiges zu den (De)Serialisierungsfunktionsn
    • demos\Demo_Tree.dpr
      - 'ne kleine Demo, wo eine XML-Datei in eine TreeView geladen und angezeigt wird
    • demos\SAXParser.dpr
      - hier wird eine kleine XML-Testdatei sequentiel geladen
    • DLLs\himXML_UseDLL.pas und DLLs\himXML_UseDLLi.pas
      - dieses sind die Schnittstellen-Units für die DLLs
      einmal als Objekte und das Andere (mit dem i) als Interfaces
      bei der Objektversion sind die Exceptions noch nicht umgeleitet, also möglichst welche vermeiden
      in der Interfaceversion funktioniert das Freigeben nochn nicht
    • DLLs\himXML_DLL.dpr und DLLs\himXML_DLLi.dpr
      - die zugehörigen DLLs
    • other\*
      - einige andere XML-Libs (verwendet in demos\CheckLibs* )
    • test files\*
      - einige "XML"-Dateien zum Testen

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)
Angehängte Dateien
Dateityp: 7z himxml_246.7z (2,70 MB, 1147x aufgerufen)
Dateityp: 7z himxml_164.7z (2,35 MB, 942x aufgerufen)
Dateityp: 7z other.7z (1,61 MB, 324x aufgerufen)
$2B or not $2B

Geändert von himitsu (30. Dez 2010 um 09:29 Uhr)
 
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#61
  Alt 28. Mai 2009, 10:18
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 )

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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#62
  Alt 28. Mai 2009, 22:47
den kranken Härtetest mußte ich grad aufgeben

hab mal versucht Seiten der DP zu parsen

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

OK, daß ich die Seitenquelltexte erstmal per Hand (mit Notepad ) 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

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
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

 
Delphi 11 Alexandria
 
#63
  Alt 29. Mai 2009, 07:02
Oh oh
Sven Harazim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#64
  Alt 29. Mai 2009, 13: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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#65
  Alt 1. Jun 2009, 16: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
  Mit Zitat antworten Zitat
Satty67

 
Delphi 2007 Professional
 
#66
  Alt 3. Jun 2009, 20: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

 
Delphi 2007 Professional
 
#67
  Alt 4. Jun 2009, 15: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

 
Delphi 12 Athens
 
#68
  Alt 4. Jun 2009, 15: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
  Mit Zitat antworten Zitat
Satty67

 
Delphi 2007 Professional
 
#69
  Alt 4. Jun 2009, 15: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

 
Delphi 12 Athens
 
#70
  Alt 4. Jun 2009, 16: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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 35   « Erste     567 8917     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 16:34

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr.
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