Announcement

Collapse
No announcement yet.

Delphi5 Updt.1 XML-Output mit ADO

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi5 Updt.1 XML-Output mit ADO

    Status : Delphi5 Updt.1 auf WIN 2000
    Versuch : mit ADO-DataSet über ODBC MS-Access-Tabelle in XML auszugeben
    Ausgabe : ist erfolgt, enthält ein Schema 'RowSetSchema' und die Daten
    'rsData'

    kommt mir komisch vor : die Daten stehen jetzt als Attributwerte drin,nicht als XML-Felder
    und es gibt auch keine DTD oder so

    Ist das so gültig und wohlgeformt (nicht nur im Sinne von MS !) ?
    Wie käme man jetzt zu einer HTML-Darstellung ?
    Kann man die Ausgabe von ADO-DataSet (ADODataSet1.SaveToFile('.\XMLtest1.xml',pfXML) ) beeinflussen ?

    Gruß von Wolf

  • #2
    Hallo,

    es gibt verschiedene Weg, ADO dazu zu bringen, die Daten nach XML zu exportieren: <br>
    a) RecordSet-Objekt: SaveToFile (mit der pfXML-Anweisung), oder <br>
    b) RecordSet+Stream-Objekt:
    <pre>
    aStrm := CoStream.Create;
    aRS.Save(aStrm, adPersistXML);
    sXML := aStrm.ReadText(aStrm.Size);
    </pre>
    c) DOMDocument-Objekt:
    <pre>
    aXML := CoDOMDocument30.Create;
    aRS.Save(aXML, adPersistXML);
    sXML := aXML.xml;
    </pre>
    Der Weg c) ist von der Performance her gesehen der Schnellste.

    Wenn es nur darum geht, die Daten aus der Datenbank als HTML-Tabelle anzuzeigen, ist der "Umweg" über XML nicht notwendig, da in Delphi 2 bequeme Alternativen zur Verfügung stehen: <br>
    1. TDataSetTableProducer <br>
    2. TPageProducer + TDataSetTableProducer <br>
    In beiden Fällen dürfen die Daten aus der Datenbank auch als XML-Daten vorliegen, den Rest macht der jeweilige TDataSet-Nachfolger

    Comment


    • #3
      Danke, Herr Kosch,

      also, ich möchte schon den Weg DB->XML->diverse(nicht nur HTML)
      einhalten, um flexibel zu bleiben !
      Insbesondere geht auch darum, unabhängig vom Datenbank-Release
      (bei uns ORACLE 8.05 u. 8.1.5, also sehr alt !) zu bleiben und trotzdem zeitgemäße Verfahren einzuführen.

      Das Beispiel c) erscheint mir persönlich als die sauberste "Lösung";
      aber könnten Sie sich noch etwas genauer ausdrücken oder mir gar
      etwas an [email protected] senden ?

      Außer mit Delphi5 ("aufgezwungen") muß ich auch mit Vis.Basic und JAVA umgehen, sodaß die Kenntnisse nicht so tief gehen...

      Insbesondere würde ich die Art, und hier kann man doch innerhalb
      der XML-Gültigkeit viel "spielen", ändern,wie Daten ausgegeben werden.
      So, daß in den Attributen nur z.B. die Rekordnummer u. ggf.Infos zur Ausgestaltung stehen, die Daten aber als Elemente von Tags umschlossen sind :
      <DATATABLE><RECORD recid="1"><NAME>Meier</NAME></RECORD></DATATABLE>

      Die von Delphi (oder von Microsoft ?) verwendete Zusammenführung
      von Metadaten u. Daten in einer einzigen XML-Datei gefällt mir eh
      nicht;Metadaten gehören doch in eine DTD, oder ?

      Danke im Vorraus für Antwort !
      Gruß vom Wol

      Comment


      • #4
        Hallo,

        das DOM-Objekt (Document Object Model) von <b>Microsoft XML 3</b> ist am schnellsten in der Lage, eine RecordSet-Datenmenge in XML umzuwandeln (genauer gesagt, gegenüber dem Stream-Objekt von ADO ist das DOM-Objekt mehr als doppelt so schnell). Um in Delphi darauf zugreifen zu können, sind die folgenden Schritte notwendig:

        1. Einmalig die <i>Microsoft XML v3.0</i>-Typbibliothek in Delphi über <i>Projekt | Typbibliothek importieren</i> (<i>\WINNT\System32\msxml3.dll</i>) in die Unit <i>MSXML2_TLB.pas</i> konvertieren lassen.

        2. Diese Importunit über Uses einbinden

        3. Im Programm verwenden, siehe folgendes Beispiel:
        <pre>
        uses
        MSXML2_TLB, // Type Lib: G:\WINNT\System32\msxml3.dll
        ADODB_TLB; // Type Lib: C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll

        {$R *.DFM}

        var
        FStart : Integer;
        FStop : Integer;

        function RecordsetToXML(const aRS: Recordset): String;
        var
        aXML : IXMLDOMDocument2;
        begin
        FStart := GetTickCount;
        aXML := CoDOMDocument30.Create;
        aRS.Save(aXML, adPersistXML);
        Result := aXML.xml;
        FStop := GetTickCount;
        end;

        function RecordsetToXML2(const aRS: Recordset): String;
        var
        aStrm : Stream;
        begin
        FStart := GetTickCount;
        aStrm := CoStream.Create;
        aRS.Save (aStrm, adPersistXML);
        Result := aStrm.ReadText(aStrm.Size);
        aStrm.Close;
        FStop := GetTickCount;
        end;

        procedure TForm1.ButtonXMLClick(Sender: TObject);
        begin
        MemoXML.Lines.Clear;
        MemoXML.Lines.Add(RecordsetToXML(adoquery1.Records et as _Recordset));
        StaticTextXML.Caption := Format('%d Windows-Ticks',[FStop - FStart]);
        end;

        procedure TForm1.ButtonStreamClick(Sender: TObject);
        begin
        MemoXML.Lines.Clear;
        MemoXML.Lines.Add(RecordsetToXML2(adoquery1.Record set as _Recordset));
        StaticTextStream.Caption := Format('%d Windows-Ticks',[FStop - FStart]);;
        end;
        </pre>
        Sowohl Borland als auch Microsoft verwenden einen zusammengeführten XML-Output, bei dem alles (Struktur und Daten) in einem Datenblock gekapselt wird. Der Vorteil dieses Ansatzes liegt darin, dass ein WideString-Parameter ausreicht, um diese Daten über SOAP oder andere Wege ohne zusätzlichen Mehraufwand zwischen Rechnern austauschen zu können.

        Wenn man selbst die Struktur definieren will, steht ab Delphi 6 <b>TXMLDocument</b> zur Verfügung. Hier kann man die einzelnen Elemente in eigener Regie zusammenstellen.

        Comment


        • #5
          Danke, Herr Kosch !
          Nun, mit MSXML habe ich unter Vis.Basic auch schon experimentiert;
          leider nur mit mäßigem Erfolg..
          Da steht mir wohl noch eine längere Lernphase bevor..
          Bis später

          Comment

          Working...
          X