|
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)
$2B or not $2B
Geändert von himitsu (30. Dez 2010 um 09:29 Uhr) |
Delphi 12 Athens |
#61
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) |
Zitat |
Delphi 12 Athens |
#62
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:
und die Startseite ... tssss, wie kann man ein <a> nicht abschließen?
Markierungen aufheben</a></span>
[b]</span>[/b]
Code:
und dann ging es imer so weiter...
<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> zum Glück sind in Webbrowsern sehr fehlerresistente Parser drin |
Zitat |
Delphi 12 Athens |
#64
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) |
Zitat |
Delphi 12 Athens |
#65
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
Dateien siehe Post #1 aktuelle Probleme:
|
Zitat |
Delphi 2007 Professional |
#66
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:
Das geht nicht
aNode := XML.RootNode.Nodes['Section_1\Value_1'];
// aNode nur NIL, wenn Pfad falsche Zeichen enthält
Delphi-Quellcode:
Das ist mein aktueller Weg
if XML.RootNode.Nodes.IndexOf('Section_1\Value_1') < 0
// Gibt immer -1, da Pfad nicht ausgewertet wird?
Delphi-Quellcode:
(kann ich später Recursiv und mit Explode auf den Pfad eleganter gestalten)
if XML.RootNode.Nodes['Section_1'].Nodes.IndexOf('Value_1') < 0
// -1 Node existiert nicht, >= 0 wenn Node existiert 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 |
Zitat |
Delphi 2007 Professional |
#67
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:
Dazu folgende Funktion gebastelt, die auch korrekt die Pfad-Abschnitte ausschneidet und prüft (NodeName Zuweisung und ShowMessage() nur zu Prüfzwecken):
<?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>
Delphi-Quellcode:
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).
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; Der komplette "Button" Test-Code hier:
Delphi-Quellcode:
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
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; |
Zitat |
Delphi 12 Athens |
#68
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 |
Zitat |
Delphi 2007 Professional |
#69
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. |
Zitat |
Delphi 12 Athens |
#70
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. |
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 |