![]() |
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 |
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 |
Re: Objekte in XML speichern
Ok, werde ich mir gleich anschauen...
|
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:
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.
Set cnth = wrt 'Dim cnth As IVBSAXContentHandler
Andreas |
Re: Objekte in XML speichern
*push*
|
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:
Dazu kommt noch soetwas:
uses
MSXML2; type TDemoClass = class(Tobject) FSomeInteger: Integer; FSomeString: String; FDemoClass: TDemoClass; procedure Serialize(cnth: ISAXContentHandler); procedure Deserialize(cnth: ISAXContentHandler); end;
Delphi-Quellcode:
Für die DOM-Schnittstelle kannst du vielleicht selbst etwas bauen - oder doch nicht?
procedure TDemoForm.ButtonClick(Sender: TObject);
var wrt: IMXWriter; cnth: ISAXContentHandler; begin wrt := CoMXXMLWriter.Create; cnth := wrt as ISAXContentHandler; cnth.startDocument; // ... end; Gute Nacht marabu |
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 |
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 |
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:
Ich bin es eher gewöhnt, einen String als PChar an eine API-Funktion zu übergeben...
cnth.endElement(Word(sEmpty[1]), 0, Word(sEmpty[1]), 0, Word(sElement[1]), Length(sElement));
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 |
Re: Objekte in XML speichern
Hallo Andreas,
Zitat:
Delphi-Quellcode:
Die wichtige Zeile ist die, in der eine IStream-Schnittstelle an wrt.output übergeben wird.
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; Zitat:
Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz