AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte in XML speichern

Ein Thema von EConvertError · begonnen am 19. Apr 2006 · letzter Beitrag vom 4. Mai 2006
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#1

Objekte in XML speichern

  Alt 19. Apr 2006, 14:19
Hallo!

Nachdem ich hier den Versuch, meine Objekte automatisiert in XML zu speichern aufgegeben habe, möchte ich die selbige Aufgabe "ganz normal" lösen.

Ich habe verschiedenste Objekte, deren Einstellungen ich im XML-Format abspeichern/auslesen will. Deshalb frage ich mich nun, wie ich das am Besten mache.

Meine Ideen:
  • Ich könnte alle Eigenschaften direkt auf ein DOM-Objekt (z.B. IXMLDocument) mappen (eventuell sogar mit GetDocBinding arbeiten?). Ist das empfehlenswert? Das braucht doch sicher viele Ressourcen und macht vielleicht nur bei Anwendungseinstellungen oder ähnlichem Sinn?
  • Die Eigenschaften erst mit LoadFromXml/SaveToXml in die Xml-Datei schreiben. Wenn dieser Ansatz zu bevorzugen ist: Soll ich mit einem DOM-Objekt arbeiten, oder lieber über SAX?

EDIT: Und wie manage ich am besten die untergeordneten Objekte, welche ebenfalls gespeichert werden müssen?

Hoffentlich habt ihr einige Vorschläge, wie ich das machen sollte...

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
Eisenherz

Registriert seit: 10. Jun 2002
Ort: Stadeln
33 Beiträge
 
Delphi 5 Professional
 
#2

Re: Objekte in XML speichern

  Alt 19. Apr 2006, 16:17
Hallo Andreas,

nachdem du in dem anderen Thread bereits auf mein RakBinaryStreamData hingewiesen wurdest, nehme ich an, dass Du zumindest grob weißt wofür man es verwenden kann.

Um dein XML-Problem zu lösen kannst du prinzipiell genauso vorgehen, wie ich bei RakBinaryStreamData. Der Unterschied besteht in der Hauptsache darin, dass bei dir ein XML-Format und bei RakBinaryStreamData ein binäres Format abgespeichert wird. Bei beiden Wegen kann man mit Hilfe von Tags eine hierarchische Struktur anlegen, womit das Problem der Unterobjekte gelöst wäre.
Ich gehe immer gern den Weg, dass die Klassen selbst wissen, wie sie sich "abspeichern" können. Das ist jetzt vielleicht etwas missverständlich, da die meisten unter "Abspeichern", das Speichern in einer Datei oder eine andere Serialisierung verstehen. Das "Abspeichern" ist im ersten Schritt aber noch keine Serialisierung, sondern ein Umwandlen in ein anderes Datenformat. Bei RakBinaryStreamData werden die Daten der Objekte in eine hierarchische Objektstruktur der Klassen von RakBinaryStreamData umgehängt. Bei XML werden die Daten der Objekte in eine hierarchische Objektstruktur der von dir verwendeten XML-Klassen umgehängt.
Erst danach wird durch den Aufruf der entsprechenden Methode die Serialisierung durchgeführt. Bei RakBinaryStreamData kommt dabei ein binärer KuddelMuddel heraus, bei XML eine Textdatei.

Aber wieder zurück dazu, dass die Klassen die Daten selbst "abspeichern", sprich in ein anderes Format umhängen. Dazu verpasse ich den Klassen immer die Methode

Code:
procedure SaveToBinaryTag(Tag: TRakBinaryTag);
Für XML hattest du in dem anderen Thread ja schon etwas ähnliches angedacht, nämlich

Code:
procedure SaveToXML(const XmlDoc: IXMLDocument);
Hier darfst du als Parameter aber nicht die Document-Klasse verwenden, sondern die Tag-Klasse deines XML-"Parser". (so nebenbei: ich verwende bevorzugt OpenXML)


Ich hoffe das reicht als Anstoß
aloa Eisenherz
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#3

Re: Objekte in XML speichern

  Alt 19. Apr 2006, 19:24
Danke für die Antwort!

Dein Vorschlag ist mir soweit klar, bis auf diesen Satz:
Zitat:
Hier darfst du als Parameter aber nicht die Document-Klasse verwenden, sondern die Tag-Klasse deines XML-"Parser".
Meinst du, dass ich lieber so eine Methode haben sollte:
SaveToXml(const ParentNode: IXMLNode); Wenn ich es mir recht überlege, ist das sicher eine gute Idee, da ich damit schon das Problem mit den untergeordneten Objekten gelöst hätte. Dann habe ich sozusagen ein Basisklasse, von der ich mir alle zu speichernden Klassen ableite, und eine "Serialisierer"-Klasse, die das XML-Dokument erzeugt und die Speicherroutinen aufruft. Und die Eigenschaften sollen nicht direkt auf ein XML-Dokument gemappt werden?

Habe ich das richtig verstanden?

Zitat:
so nebenbei: ich verwende bevorzugt OpenXML
Damit wären wir bei meinem zweiten Problem: Wie soll ich die XML-Dateien lesen/schreiben? Soll ich lieber einen SAX-Ansatz probieren, oder soll ich lieber den DOM-Ansatz (welche Implementation ist ja egal und OT) verwenden?

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Objekte in XML speichern

  Alt 19. Apr 2006, 20:17
Hallo Andreas,

deine erste Frage hast du dir schon fast selbst beantwortet: nimmst du das Document als Parameter für die Serialisierung, dann wirst du Probleme beim Speichern von Substrukturen und endlich rekursiven Strukturen bekommen.

DOM oder SAX? Das Document Object Model bietet dir Zugriffsmethoden und einfache Transformationsmöglichkeiten, baut aber seinen Content komplett im Hauptspeicher auf. Der SAX-Parser arbeitet mit einer Ereignis-Schnittstelle und kann XML-Dokumente im streaming mode verarbeiten. Da deine Daten bereits eine interne Repräsentation besitzen, wäre ein DOM-Document nur eine weitere Darstellung und damit Speicherverschwendung - es sei denn du nutzt die DOM features irgendwie.

Grüße vom marabu
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#5

Re: Objekte in XML speichern

  Alt 20. Apr 2006, 20:16
Danke für die Antwort.

Ok, somit ist die erste Frage für mich ausreichend geklärt. Dankeschön.

Dann werde ich versuchen, das ganze mittels SAX zu lösen. Leider habe ich mit SAX noch keine Erfahrung (die Grundprinzipien sind mir bekannt, mehr leider auch schon nicht). Wie funktioniert das beispielsweise mit folgender Funktion:
procedure SaveToXml(const IXMLNode) IXMLNode gibt es ja nur in DOM...
Wie manage ich untergeordnete Objekte mit SAX?

Besitzt Delphi 7 Professional eine eingebaute SAX-Implementation (so wie es für DOM IXMLDocument, bzw. TXMLDocument gibt), oder muss ich auf externe Komponenten, etc. zurückgreifen?
Wenn es das nicht gibt, ist es eine gute Idee MSXML (Typbibliothek importieren) zu nutzen?

Andreas
Andreas N.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Objekte in XML speichern

  Alt 20. Apr 2006, 20:38
Du kannst die MS SAX-Implementierung verwenden, wenn du die MSXML?.DLL importierst. Um mit SAX warm zu werden, solltest du Zugriff auf den Platform SDK haben. Oder lade dir den XML SDK - der ist bedeutend kleiner (etwa 6 MB, wenn ich mich nicht irre).

Baue nicht gleich deine Anwendung um, sondern überlege was du brauchst und schreibe dir eine Demo-Anwendung, die das umsetzt. Das macht es auch einfacher dir zu helfen, falls du noch Hilfe brauchst.

Grüße vom marabu
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#7

Re: Objekte in XML speichern

  Alt 21. Apr 2006, 14:25
Vielen Dank für die Antwort!

Ok, da es keine Delphi-SAX-Lösung (keine ohne Zusatzkomponenten, zumindest) gibt, werde ich wohl die MS-SAX-Implementation nutzen.

Ich werde mich da mal schlau lesen, was SAX betrifft und bei Fragen einen neuen Thread aufmachen. Klar baue ich nicht gleich meine gesamte Anwendung um.

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#8

Re: Objekte in XML speichern

  Alt 22. Apr 2006, 19:56
Hallo noch einmal!

Noch eine Frage:
Kann ich MSXML 6.0 auch auf Windows NT Rechnern installieren? Das fertige Programm soll auch unter Windows NT laufen.

Danke,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Objekte in XML speichern

  Alt 22. Apr 2006, 20:00
Zitat von EConvertError:
Hallo noch einmal!

Noch eine Frage:
Kann ich MSXML 6.0 auch auf Windows NT Rechnern installieren? Das fertige Programm soll auch unter Windows NT laufen.

Danke,
Andreas
Hi,

Laut der Downloadseite von Microsoft zu MSXML 6 nicht:
http://www.microsoft.com/downloads/d...displaylang=en

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Objekte in XML speichern

  Alt 22. Apr 2006, 20:12
Hallo.

Da überschneiden sich die Anforderungen etwas. MS liefert MSXML6 nur als Installer Package aus und dieses verlangt den Installer 3.1, der erst ab Win2K eingesetzt werden kann. Auf Seiten von MSXML6 selbst ist von MS keine Aussage mehr zu NT zu erwarten, da dieses Betriebssystem aus Sicht von MS bereits gestorben ist. Würde mich nicht wundern, wenn sich die etwa drei libraries auf NT per Hand installieren ließen, aber warum den Aufwand - MSXML4 tut es auch noch eine Weile.

Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     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:

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