Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Objekte in XML speichern (https://www.delphipraxis.net/67754-objekte-xml-speichern.html)

EConvertError 22. Apr 2006 19:15

Re: Objekte in XML speichern
 
Das auf der Downloadseite habe ich auch schon gesehen, aber ich habe doch noch irgendwie gehofft. :wink:
Egal, wie marabu schon geschrieben hat, ist MSXML auch noch OK.

Ich lese gerade in der MSDN Library für Visual Studio 2005 über die SAX-Implementation von MSXML.
Dort steht, dass SAX nur zum Lesen, aber nicht zum Schreiben geeignet ist. Besitzt MSXML nichts, was mit dem XmlWriter aus .net vergleichbar ist?

Einfach eine Klasse, mit der man Xml-Dateien schreiben kann, ohne sich ein DOM-Objekt erzeugen zu müssen...

Andreas

marabu 22. Apr 2006 19:25

Re: Objekte in XML speichern
 
Ab SAX Version 2 gibt es den MXXMLWriter - der sollte das sein, was du suchst. In der Dokumentation wird er manchmal als SAXXMLWriter bezeichnet...

marabu

EConvertError 23. Apr 2006 16:00

Re: Objekte in XML speichern
 
Ok, werde ich mir gleich anschauen...

EConvertError 23. Apr 2006 17:23

Re: Objekte in XML speichern
 
So, ich habe mich jetzt etwas mit SAX auseinandergesetzt.

Habe ich folgendes richtig verstanden:
Wenn ich SAX verwende, schreibe ich in ein XML-Dokument so wie z.B. in einen Stream. Das heißt, um meine untergeordneten Objekte in das XML-Dokument zu speichern, übergebe ich der Methode meinen MXXMLWriter und mein Objekt schreibt sich an die aktuelle Stelle im MXXMLWriter.

Wenn ich also einen genauen ParentNode angeben will, muss ich DOM verwenden. Selbiges gilt natürlich auch für das Lesen. Das bringt mich zum Überlegen, ob ich nicht doch DOM verwenden sollte. :gruebel:


Außerdem habe ich ein Problem mit dem MXXMLWriter:
Der unterstützt von Haus aus die Methoden zum Schreiben des XML-Dokuments nicht. Aber man kann die Handler-Interfaces zum MXXMLWriter-Objekt casten. Das Codebeispiel aus der MSDN Library ist aber leider in Visual Basic und dieser Sprache bin ich leider nicht mächtig.
Dort werden die Interfaces IVBSAXContentHandler, IVBSAXDTDHandler, IVBSAXLexicalHandler, IVBSAXDeclHandler, IVBSAXErrorHandler dem MXXMLWriter zugewiesen.
Code:
Set cnth = wrt 'Dim cnth As IVBSAXContentHandler
Wenn ich das in Delphi versuche, erhalte ich die Exception 'Schnittstelle nicht unterstützt'. Ich habe auch die Interfaces ISAXContentHandler, etc. (also ohne VB probiert) - ohne Erfolg.

Andreas

EConvertError 26. Apr 2006 18:41

Re: Objekte in XML speichern
 
*push*

marabu 26. Apr 2006 21:35

Re: Objekte in XML speichern
 
Hallo Andreas,

fertigen Code für SAX2 kann ich dir heute keinen geben, vielleicht komme ich morgen dazu. Er wird sich in etwa so anfühlen:

Delphi-Quellcode:
uses
  MSXML2;

type
  TDemoClass = class(Tobject)
    FSomeInteger: Integer;
    FSomeString: String;
    FDemoClass: TDemoClass;
    procedure Serialize(cnth: ISAXContentHandler);
    procedure Deserialize(cnth: ISAXContentHandler);
  end;
Dazu kommt noch soetwas:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  wrt: IMXWriter;
  cnth: ISAXContentHandler;
begin
  wrt := CoMXXMLWriter.Create;
  cnth := wrt as ISAXContentHandler;
  cnth.startDocument;
  // ...
end;
Für die DOM-Schnittstelle kannst du vielleicht selbst etwas bauen - oder doch nicht?

Gute Nacht

marabu

marabu 27. Apr 2006 18:59

Re: Objekte in XML speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Andreas,

ich habe eine kleine Demo erstellt, welche dir zeigt, wie du ein verschachteltes Objekt mit SAX2 speichern kannst - das Laden habe ich erstmal weggelassen. Bei Bedarf musst du dich halt nochmal bemerkbar machen.

Grüße vom marabu

EConvertError 27. Apr 2006 19:12

Re: Objekte in XML speichern
 
Danke für die Antwort!

Wahnsinn, eien Demo wäre super! *freu*
Edit: *Demo gleich anschau*

Ob ich jetzt DOM oder SAX benutze überlege ich mir selbst, aber SAX möchte (muss?) ich sowieso lernen.

Klar, DOM ist mir schon in allen Varianten vertraut (Delphi's "eingebaute" Lösung, MSXML).

Andreas

EConvertError 27. Apr 2006 19:23

Re: Objekte in XML speichern
 
Sieht soweit sehr vielversprechend für mich aus!

Muss ich wrt.output "manuell" in einen FileStream schreiben, oder besitzt die MXXMLWriter-Klasse eine Funktion, die das direkt macht? Oder kann ich Output auf meinen FileStream umleiten?

Könntest du mir erklären, was das für eine Art von String-Paramemter-Übergabe ist:
Delphi-Quellcode:
cnth.endElement(Word(sEmpty[1]), 0, Word(sEmpty[1]), 0, Word(sElement[1]), Length(sElement));
Ich bin es eher gewöhnt, einen String als PChar an eine API-Funktion zu übergeben...

Ansonsten ist mir Alles klar und ich werde mich selbstverständlich wieder ordentlich damit auseinander setzen, bevor ich weitere Fragen stelle (Ich hoffe natürlich, dass ich das nicht mehr tun muss :wink: ).

Vielen Dank,
Andreas

marabu 28. Apr 2006 10:35

Re: Objekte in XML speichern
 
Hallo Andreas,

Zitat:

Zitat von EConvertError
Oder kann ich Output auf meinen FileStream umleiten?

eine clevere Frage. Ich habe den entsprechenden Code mal angepasst:

Delphi-Quellcode:
begin
  // ...
  fn := 'c:\daten\dp\sax-demo.xml';
  fs := TFileStream.Create(fn, fmCreate);
  wrt := CoMXXMLWriter.Create;
  cnth := wrt as ISAXContentHandler;
  wrt.output := TStreamAdapter.Create(fs, soReference) as IStream;
  cnth.startDocument;
  dc.Serialize(cnth);
  cnth.endDocument;
  wrt.flush;
  fs.Free;
  // ...
end;
Die wichtige Zeile ist die, in der eine IStream-Schnittstelle an wrt.output übergeben wird.

Zitat:

Zitat von EConvertError
Könntest du mir erklären, was das für eine Art von String-Paramemter-Übergabe ist: cnth.endElement(Word(sEmpty[1]), 0, ...
Ich bin es eher gewöhnt, einen String als PChar an eine API-Funktion zu übergeben...

Genau das passiert hier, allerdings nicht für einen Single-Byte-Character String, sondern für einen Double-Byte-Character String.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 Uhr.
Seite 2 von 4     12 34      

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