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 2 von 4     12 34      
EConvertError

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

Re: Objekte in XML speichern

  Alt 22. Apr 2006, 19:15
Das auf der Downloadseite habe ich auch schon gesehen, aber ich habe doch noch irgendwie gehofft.
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
Andreas N.
  Mit Zitat antworten Zitat
marabu

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

Re: Objekte in XML speichern

  Alt 22. Apr 2006, 19:25
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
  Mit Zitat antworten Zitat
EConvertError

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

Re: Objekte in XML speichern

  Alt 23. Apr 2006, 16:00
Ok, werde ich mir gleich anschauen...
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

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

Re: Objekte in XML speichern

  Alt 23. Apr 2006, 17:23
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.


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
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

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

Re: Objekte in XML speichern

  Alt 26. Apr 2006, 18:41
*push*
Andreas N.
  Mit Zitat antworten Zitat
marabu

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

Re: Objekte in XML speichern

  Alt 26. Apr 2006, 21:35
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
  Mit Zitat antworten Zitat
marabu

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

Re: Objekte in XML speichern

  Alt 27. Apr 2006, 18:59
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
Angehängte Dateien
Dateityp: zip sax-demo_133.zip (1,3 KB, 66x aufgerufen)
  Mit Zitat antworten Zitat
EConvertError

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

Re: Objekte in XML speichern

  Alt 27. Apr 2006, 19:12
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
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

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

Re: Objekte in XML speichern

  Alt 27. Apr 2006, 19:23
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:
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 ).

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

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

Re: Objekte in XML speichern

  Alt 28. Apr 2006, 10:35
Hallo Andreas,

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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 16:48 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