XML SAX
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
XML SAX
Hallo Forenmitglieder,
fast schon aus der Mode (XML:-), aber ich würde gerne mit Lazarus große XML Dateien einlesen und zwar nach der SAX Methode.
Wenn ich das richtig verstanden habe, ist SAX resourchenschonender (sequenzielle Abarbeitung der XML Datei möglich man braucht nicht komplett die XML Datei in eine DOM Struktur in den RAM laden).
Die Beispiele in Lazarus zu XML Dom habe ich soweit gesehen. Es gab wohl auch mal ein TSAXReader siehe https://forum.lazarus.freepascal.org/in ... ml#msg9069. Wurden die Arbeiten am TSAXReader eingestellt (und durch was ersetzt)?
Ich finde dazu leider auch keine griffigen Beispiele (mehr).
Kann mich hier jemand auf die richtigen Web Seiten per Link stubsen oder mich mit einem einfachen aber lauffähigen TSAXReader Beispiel versorgen?
Ich möchte mich ungern in der C/C++ Welt bedienen müssen (SAX aus der LibXML2 www.xmlsoft.org ist bestimmt gut aber eben nicht Pascal )
Vielen Dank bereits im voraus für eure Tipps und Gruß
Helios
fast schon aus der Mode (XML:-), aber ich würde gerne mit Lazarus große XML Dateien einlesen und zwar nach der SAX Methode.
Wenn ich das richtig verstanden habe, ist SAX resourchenschonender (sequenzielle Abarbeitung der XML Datei möglich man braucht nicht komplett die XML Datei in eine DOM Struktur in den RAM laden).
Die Beispiele in Lazarus zu XML Dom habe ich soweit gesehen. Es gab wohl auch mal ein TSAXReader siehe https://forum.lazarus.freepascal.org/in ... ml#msg9069. Wurden die Arbeiten am TSAXReader eingestellt (und durch was ersetzt)?
Ich finde dazu leider auch keine griffigen Beispiele (mehr).
Kann mich hier jemand auf die richtigen Web Seiten per Link stubsen oder mich mit einem einfachen aber lauffähigen TSAXReader Beispiel versorgen?
Ich möchte mich ungern in der C/C++ Welt bedienen müssen (SAX aus der LibXML2 www.xmlsoft.org ist bestimmt gut aber eben nicht Pascal )
Vielen Dank bereits im voraus für eure Tipps und Gruß
Helios
-
- Beiträge: 843
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: XML SAX
in etwa wie das hier: http://www.kluug.net/oxml.php?
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: XML SAX
Hab ich schon bei meinen Recherchen gesehen, ist aber leider nicht Open Source
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: XML SAX
Hi!
Hier gibt's Sax für Delphi:
https://sourceforge.net/projects/saxforpascal/
Vielleicht läuftt das ja unter Lazarus.
Winni
Hier gibt's Sax für Delphi:
https://sourceforge.net/projects/saxforpascal/
Vielleicht läuftt das ja unter Lazarus.
Winni
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: XML SAX
Hi Winni,
hatte ich auch gesehen, ist aber seit fast 18 Jahren nicht mehr "angefasst" worden. Ich hatte gedacht der SAX Pfad in Lazarus selbst ist weiterentwickelt worden, so wie der DOM Ansatz in Lazarus ein Standard ist (mit Beispielen in der Lazarusinstallation etc.).
Den TSAXReader hat es aber mal in Lazarus gegeben oder täusche ich mich da total? Ich grabe mal tiefer in der Klassen Hierarchie (vielleicht tauche ich ja wieder auf:-))
Danke aber für den Hinweis, Winni!
Gruß
Helios
hatte ich auch gesehen, ist aber seit fast 18 Jahren nicht mehr "angefasst" worden. Ich hatte gedacht der SAX Pfad in Lazarus selbst ist weiterentwickelt worden, so wie der DOM Ansatz in Lazarus ein Standard ist (mit Beispielen in der Lazarusinstallation etc.).
Den TSAXReader hat es aber mal in Lazarus gegeben oder täusche ich mich da total? Ich grabe mal tiefer in der Klassen Hierarchie (vielleicht tauche ich ja wieder auf:-))
Danke aber für den Hinweis, Winni!
Gruß
Helios
-
- Beiträge: 308
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: XML SAX
SAX_XML heißt die Unit in FPC
Meine Internet Tools haben auch so was, aber primär für HTML gedacht: https://github.com/benibela/internettoo ... parser.pas
Meine Internet Tools haben auch so was, aber primär für HTML gedacht: https://github.com/benibela/internettoo ... parser.pas
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: XML SAX
Hallo BeniBela,
auch für Deinen Beitrag herzlichen Dank!
Ja, die SAX und SAX_XML werden mit Lazarus/Free Pascal ausgeliefert, aber weiter als die Jungs in https://forum.lazarus.freepascal.org/in ... ml#msg9069 (wie eingangs erwähnt) komme ich auch nicht. Ich lande auch bei einem Laufzeitfehler... Schade.
Im Anhang mal das komplette Beispielprojekt, in der Hoffnung, das sich doch jemand findet, der mit dem ausgelieferten SAX Parser positive Erfahrungen gemacht hat und sein Wissen teilen kann.
Danke nochmal an alle und Gruß
Helios
auch für Deinen Beitrag herzlichen Dank!
Ja, die SAX und SAX_XML werden mit Lazarus/Free Pascal ausgeliefert, aber weiter als die Jungs in https://forum.lazarus.freepascal.org/in ... ml#msg9069 (wie eingangs erwähnt) komme ich auch nicht. Ich lande auch bei einem Laufzeitfehler... Schade.
Im Anhang mal das komplette Beispielprojekt, in der Hoffnung, das sich doch jemand findet, der mit dem ausgelieferten SAX Parser positive Erfahrungen gemacht hat und sein Wissen teilen kann.
Danke nochmal an alle und Gruß
Helios
- Dateianhänge
-
- Test.zip
- (126.77 KiB) 64-mal heruntergeladen
-
- Beiträge: 825
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: XML SAX
TSAXReader ist eigentlich eine abstrakte Klasse. Du musst TXMLSAXReader aus SAX_XML. Außerdem ist der Eingabeparameter für Parse eben nicht der Dateiname, sonder XML String selbst. Wenn du eine Datei statt einen String hast, dann solltest du besser TSAXInputSource verwenden. Letztlich schaut dein Code dann so aus (und du musst dann auch noch die Unit SAX_XML verwenden):
Anmerkung: beachte, dass das Erstellen des TSAXXMLReader innerhalb des then-Zweigs der if-Bedingung ist, da du andernfalls ein Memory Leak hättest, wenn der User keinen Dateinamen auswählt.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var XMLReader:TSAXReader;
fs: TFileStream;
src: TSAXInputSource;
begin
if (OpenDialog1.Execute) then
begin
fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
src := TSAXInputSource.Create(fs);
try
XMLReader := TXMLSAXReader.Create;
try
XMLReader.OnStartElement := @MyStartElementEvent;
XMLReader.Parse(src);
//XMLReader:=nil;
finally
XMLReader.Free
end;
finally
src.Free;
end;
finally
fs.Free;
end;
end;
end;
FPC Compiler Entwickler
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: XML SAX
Hallo PascalDragon,
da hast Du Deinem Namen alle Ehre gemacht! Vielen Dank!
Mit Deinem/Euren Hinweis/Hinweisen habe ich noch weitergegraben und weitere CallBackfunktionen integriert.
Aus meiner Sicht sind die wesentlichen Hürden für die Verwendung des FPC SAX Ansatzes überwunden und ich kann diesen Thread hier erfolgreich schließen.
Vielen Dank nochmal an ale Beteiligten.
Tolle Programmiersprache und super Forum(mitglieder)!
Habt einen schönen Sonntag
Gruß
Helios
Ein compilier- und ausführbares Projekt für alle die auf das gleiche Problem stoßen werden oder gestoßen sind im Anhang.
da hast Du Deinem Namen alle Ehre gemacht! Vielen Dank!
Mit Deinem/Euren Hinweis/Hinweisen habe ich noch weitergegraben und weitere CallBackfunktionen integriert.
Aus meiner Sicht sind die wesentlichen Hürden für die Verwendung des FPC SAX Ansatzes überwunden und ich kann diesen Thread hier erfolgreich schließen.
Vielen Dank nochmal an ale Beteiligten.
Tolle Programmiersprache und super Forum(mitglieder)!
Habt einen schönen Sonntag
Gruß
Helios
Code: Alles auswählen
unit TestMain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, SAX, SAX_XML;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure MyStartDocument(Sender: TObject);
procedure MyEndDocument(Sender: TObject);
procedure MyStartElementEvent(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; Atts: TSAXAttributes);
procedure MyEndElementEvent(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
procedure MyCharactersEvent(Sender: TObject; const ch: PSAXChar; AStart, ALength: Integer);
procedure MyIgnorableWhitespaceEvent(Sender: TObject; const ch: PSAXChar; AStart, ALength: Integer);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.MyStartDocument(Sender: TObject);
begin
Form1.ListBox1.Items.Add('MyStartDocument');
end;
procedure TForm1.MyEndDocument(Sender: TObject);
begin
Form1.ListBox1.Items.Add('MyEndDocument');
end;
procedure TForm1.MyStartElementEvent(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; Atts: TSAXAttributes);
begin
Form1.ListBox1.Items.Add('MyStartElementEvent ' + NamespaceURI + ' ' + LocalName + ' ' + QName);
end;
procedure TForm1.MyEndElementEvent(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
begin
Form1.ListBox1.Items.Add('MyEndElementEvent ' + NamespaceURI + ' ' + LocalName + ' ' + QName);
end;
procedure TForm1.MyCharactersEvent(Sender: TObject; const ch: PSAXChar; AStart, ALength: Integer);
begin
//Form1.ListBox1.Items.Add('MyCharactersEvent ' + ch + ' ' + IntToStr(AStart) + ' ' + IntToStr(ALength));
end;
procedure TForm1.MyIgnorableWhitespaceEvent(Sender: TObject; const ch: PSAXChar; AStart, ALength: Integer);
begin
//Form1.ListBox1.Items.Add('MyIgnorableWhitespaceEvent ' + ch + ' ' + IntToStr(AStart) + ' ' + IntToStr(ALength));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
XMLReader: TSAXReader;
fs: TFileStream;
src: TSAXInputSource;
begin
ListBox1.Items.Clear;
if (OpenDialog1.Execute) then
begin
fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
src := TSAXInputSource.Create(fs);
try
XMLReader := TSAXXMLReader.Create;
try
XMLReader.OnStartDocument := @MyStartDocument;
XMLReader.OnEndDocument := @MyEndDocument;
XMLReader.OnStartElement := @MyStartElementEvent;
XMLReader.OnEndElement := @MyEndElementEvent;
XMLReader.OnCharacters := @MyCharactersEvent;
XMLReader.OnIgnorableWhitespace := @MyIgnorableWhitespaceEvent;
XMLReader.Parse(src);
//XMLReader:=nil;
finally
XMLReader.Free
end;
finally
src.Free;
end;
finally
fs.Free;
end;
end;
end;
end.
- Dateianhänge
-
- TestOk.zip
- (128.09 KiB) 78-mal heruntergeladen
Re: XML SAX
Hallo,
mir ist bewusst, dass dieser Thread schon mehr als 1 Jahr alt ist. Ich bin heute drauf gestossen auf der Suche nach einer Möglichkeit, eine SVG-Datei (also auch eine XML-Datei) zu parsen um die Elemente in einem Codegenerator auswerten zu können (die Inhalte der SVG werden in ein umfangreiches JavaScript-Array konvertiert, welches dann in 3D dargestellt wird). Und deine Frage sowie das komplette Beispiel haben mich gerade erheblich weiter gebracht. Deshalb habe ich mich angemeldet bzw. meine Registrierung fürs Forum erneutert um einfach mal DANKE zu sagen.
Gruss
GU_Meyer
mir ist bewusst, dass dieser Thread schon mehr als 1 Jahr alt ist. Ich bin heute drauf gestossen auf der Suche nach einer Möglichkeit, eine SVG-Datei (also auch eine XML-Datei) zu parsen um die Elemente in einem Codegenerator auswerten zu können (die Inhalte der SVG werden in ein umfangreiches JavaScript-Array konvertiert, welches dann in 3D dargestellt wird). Und deine Frage sowie das komplette Beispiel haben mich gerade erheblich weiter gebracht. Deshalb habe ich mich angemeldet bzw. meine Registrierung fürs Forum erneutert um einfach mal DANKE zu sagen.
Gruss
GU_Meyer