Autor Beitrag
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 24.07.08 20:16 
XML - Lesen, Ändern, Schreiben
Version 1.0


Beschreibung

Mit dieser Unit können XML-Daten in einen übersichtlichen Baum gelesen, dort durch verschiedene Methoden bearbeitet und schließlich auch wieder gespeichert werden. Als Lesequellen und Speicherziele werden Streams, Dateien, Ressourcen, Strings und die Zwischenablage unterstützt.

Parser-Fehlermeldungen
Der Parser ist sehr "streng", es werden viele Fehlermeldungen ausgelöst. Diese sind Variablen, sie können also während der Laufzeit übersetzt werden. Außerdem wird beim Lesen und Schreiben eine Quelle gespeichert, die bei Fehlern mit angegeben ist. Außerdem können alle Exceptions des Parsers unterdrückt und durch eine Eigenschaft ausgelesen werden.

CDATA
Der Parser lässt keinen einfachen Text zu - ausgenommen, er wird durch CDATA-Begrenzer markiert. Diese CDATA-Teile werden in einen String geschrieben.

Kommentar
Wahrscheinlich gibt es schon viele solcher Units. Ich habe sie mir irgendwann einmal zusammgebastelt, weil ich eine brauchte. Jetzt habe ich sie wiederentdeckt, noch ein bisschen verbessert und kommentiert. Kommentare sind nur im Interface-Teil vorhanden, wenn Fragen zum Quelltext auftreten, beantworte ich sie gerne. Ich denke, die Handhabung dürfte ganz einfach sein, ich will jedoch trotzdem ein kleines Beispiel zur Verwendung zeigen:

Verwendung
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var Document: TXMLDocument; Tag: TXMLTag;
begin
  Document := TXMLDocument.Create;
  try
    // Dokument aus Datei ladne
    Document.LoadFromFile('Datei.xml');

    // Tag 'eingenschaften' auswählen, ggf. erstellen
    Tag := fXMLDocument.GetTag('eigenschaften', True);

    // Einige Eigenschaften aus dem ausgewählten Tag auslesen
    Titel := Tag.Attributes.Values['titel'];
    Autor := Tag.Attributes.Values['autor'];
    Anzahl := StrToInt(Tag.Attributes.Values['anzahl']);

    Anzahl := Anzahl + 1;

    // Eigenschaft verändern
    Tag.Attributes.Values['anzahl'] := IntToStr(Anzahl);

    // Dokument speichern
    Document.SaveToFile('Datei.xml');
  finally
    Document.Free;
  end;
end;

Das war jetzt bei weitem keine komplette Funktionsübersicht, aber als Einstieg sollte es genügen. Außerdem denke ich, dass die Methoden selbsterklärend benannt sind. ;)


Versionsgeschichte

Version 1.0
Größe: 25 KB
Datum: 24. Juli 2008
Changelog:
(Erste Version)
Download


Download

Per Yogularm-Mirror
[url=www.yogularm.de/files/XML.pas]user defined image[/url]

Per Anhang
Einloggen, um Attachments anzusehen!
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Do 07.08.08 10:17 
Hallo! :wink2:

Da sieht doch schon recht gut aus. Und das gute dran: So eine Unit kann ich bald recht gut gebrauchen. ;-)

Gut finde ich, dass ich mit ein und der selben Klasse nicht nur XML Daten einlesen sondern auch wieder ausgeben kann! Super!

Sollte ich Fehler oder sonstige Bemerkungen haben werde ich mich natürlich melden!!!!

Lg, Martin

_________________
Ein Nutzer der Ecke ;-)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 07.08.08 18:03 
Sieht vom drübergucken her ganz nett aus. Zumindest die Fehlermeldungen machen es schonmal vielseitiger als meinen.
So wie ich das sehe fehlen aber Kommentare(<!-- -->) und damit Zusammenhängend <! > -Knoten (z.B. DOCTYPE), oder?

Hast du eventuell Geschwindigkeitsschätzungen? Ist nur n Gefühl, aber irgendwas sieht bei dir langsam aus... relativ komplex halt.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 21.08.08 14:51 
Schön, da kommt man gerade aus dem Urlaub, und es gibt neues Feedback. :D

user profile iconMartin1966 hat folgendes geschrieben:
Da sieht doch schon recht gut aus. Und das gute dran: So eine Unit kann ich bald recht gut gebrauchen. ;-)

Das freut mich.

user profile iconMartin1966 hat folgendes geschrieben:
Sollte ich Fehler oder sonstige Bemerkungen haben werde ich mich natürlich melden!!!!

Mach das!

user profile iconMartok hat folgendes geschrieben:
So wie ich das sehe fehlen aber Kommentare(<!-- -->) und damit Zusammenhängend <! > -Knoten (z.B. DOCTYPE), oder?

Ja, Kommentare fehlen noch. Das liegt daran, dass ich die Unit eigentlich nur zum Speichern von Daten verwende, die normalerweise nicht manuell bearbeitet werden. Kommentare waren deshalb noch nicht notwendig. Wenn ich mal etwas Zeit und Lust habe, werde ich sie natürlich noch einbauen. DOCTYPE-Anweisungen sind auch nicht möglich. Nur <?xml ... ?> wird einfach ignoriert.

user profile iconMartok hat folgendes geschrieben:
Hast du eventuell Geschwindigkeitsschätzungen? Ist nur n Gefühl, aber irgendwas sieht bei dir langsam aus... relativ komplex halt.

Bei normal großen Dateien merkt man den Ladevorgang eigentlich so gut wie nicht - sind nur ein paar Millisekunden. Komplexe SVG-Dateien könnten schon etwas Zeit benötigen, ich habe das aber noch nicht getestet. Ich gebe es ja zu, die Schleife sieht ziemlich kompliziert aus, aber das meiste sind nur Fehlermeldungen, die im Normalfall sowieso nicht ausgeführt werden müssen.

Danke an euch beide, ich bin offen für weitere Kommentare :)
tekkyeah
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 29.10.08 21:10 
Hallo,
beim ersten Test erhalte ich leider schon eine Fehlermeldung.
"Fehler beim Parsen von Datei '1225216354593.xml' (Zeile 1, Zeichen 62): Bezeichner erwartet, aber '=' gefunden.

Die XML-Datei sieht so gut aus, wird von einem Shop erstellt und lässt sich problemlos mit dem IE darstellen.

Gruß
Holger
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 29.10.08 21:46 
user profile icontekkyeah hat folgendes geschrieben Zum zitierten Posting springen:
beim ersten Test erhalte ich leider schon eine Fehlermeldung.
"Fehler beim Parsen von Datei '1225216354593.xml' (Zeile 1, Zeichen 62): Bezeichner erwartet, aber '=' gefunden.

Ohne die XML-Datei kann ich leider nicht feststellen, wo der Fehler liegt :nixweiss:

user profile icontekkyeah hat folgendes geschrieben Zum zitierten Posting springen:
Die XML-Datei sieht so gut aus, wird von einem Shop erstellt und lässt sich problemlos mit dem IE darstellen.

Mein Parser ist ziemlich "streng", das heißt es wird viel als Fehler angesehen, was von anderen Parsern vielleicht noch durchgeht. Aber poste doch einfach mal die Zeile 1 deiner Datei. :idea:

Danke fürs Testen!

Grüße,
Yogu
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Fr 13.02.09 16:38 
hallo,

wie sieht es mit Delphi 2009 aus, compilieren geht, aber beim parsen sieht Text in TXMLDocument.Read(const Text, Source: String); sehr merkwürdig aus.
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 13.02.09 17:30 
user profile iconkkausp hat folgendes geschrieben Zum zitierten Posting springen:
wie sieht es mit Delphi 2009 aus, compilieren geht, aber beim parsen sieht Text in TXMLDocument.Read(const Text, Source: String); sehr merkwürdig aus.


Hallo,

meinst du damit diese Funktion:

ausblenden Delphi-Quelltext
 
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
{ ... }
procedure TXMLDocument.LoadFromStream(Stream: TStream; const Name: String = '');
var S, Source: String;
begin
  Assert(Assigned(Stream));

  SetLength(S, Stream.Size);
  Stream.Read(PChar(S)^, Length(S));
  if Name <> '' then Source := Name else Source := XMLName_Unknown;
  Read(S, Source);
end;

Entspricht dort S nach Zeile 627 nicht dem Dateiinhalt?

Vielleicht ist die Konstruktion PChar(S)^ daran schuld - sie tut bei mir zwar, aber es sieht trotzdem recht seltsam aus. Probier mal stattdessen Pointer(S)^ aus.

Grüße,
Yogu