Letztes Jahr habe ich viel Zeit damit verbracht, mit Delphi eine XML-basierte Webanwendung zu entwickeln. Die ursprüngliche Idee war wunderschön, aber das Ergebnis war, dass die Dinge sehr einfach waren. Ein Teil des Grundes ist, dass die Implementierung der Datenbindung zwischen XML und Objekt zu problematisch ist (der andere Teil ist, dass es mit XSLT nicht vertraut ist und viel Zeit dauert, um es zu lernen).
Ich habe immer die von Delphi bereitgestellte XML -Datenbindung verwendet. Natürlich ist es sehr bequem, wenn es im Programm generiert wird. Das Problem ist jedoch, dass es während des Entwicklungsprozesses des Programms immer einige Änderungen geben wird. Sehr problematisch.
Wenn ich also an die Objektivierung des Datensatzes denke, denke ich sofort, dass ich auch RTTI verwenden kann, um die XML -Persistenz des Objekts zu implementieren. Die mit DelPhi6 begonnene SOAP -Implementierung besteht darin, RTTI zu verwenden, um die Konvertierung von Objekten in SOAP -Daten (SOAP -Daten (SOAP -Daten (SOAP) (DEAP) zu implementieren (Daten) (SOAP -Daten (( Das heißt, XML). Offensichtlich war ich schon sehr spät. Arbeite vor ein paar Jahren und ich habe ihn sofort nach seinem Quellcode gefragt. Lexlib ist eine Bibliothek mit vielen Funktionen, die ein bisschen wie die grundlegende Klassenbibliothek von .NET aussieht (natürlich nicht so groß ^o ^). Da ich diesen Teil nur brauche, müssen diese gesamte Bibliothek nicht so viel Mühe verwenden. erreichen:
TmxmlPersistent = Klasse (tobject) öffentliche Klassenprozedurnee loadObjfromxml (Anode: ixmlnode; aObj: tpersistent); ing tkset, tkwchar, tklstring, tkwstring, tkint64]; Beginnen Sie wenn ( AOBJ ist Tmdatasetproxy) dann (aObj als tmdatasetproxy) .loadFromxml (Anode). ; Anode.Childnodes [Widestring (Pinfo^.Name)], tmpobj als tpersistent); Pinfo^.Name). PPROPINFO; pinfo: = plist.props [i]; (TMPOBJ ist tpersistent)) Dann SaveObjtoxml (Anode.Addchild (Widestring (Pinfo^.Name)), Tmpobj als tpersistent); ^ .Name) .Text: = GetPropValue (AOBJ, Pinfo^.
Diese Implementierung sollte als sehr einfach bezeichnet werden. Es gibt hauptsächlich drei Teile (die Struktur von Last und Speichern ist ähnlich):
Erstens wird eine besondere Verarbeitung an TMDatasetproxy durchgeführt und diese Klasse anvertraut, um ihre Implementierung selbst zu bewältigen. .
Die zweite besteht darin, die Klasse rekursiv zu verarbeiten und natürlich nur die Klasse von Tpersistent zu unterstützen.
Drittens wird das allgemeine Feld einfach in Zeichenfolge konvertiert und gespeichert, wodurch sich der Filter von Lexlib leiht und nur Datentypen verarbeitet, die einfach in Zeichenfolge konvertiert werden können, wodurch die Typen herausgefiltert werden, die Konvertierungsfehler verursachen können.
Für die im obigen Code verwendete TMPropList finden Sie die Implementierung in "Verwenden von Delphi RTTI zur Implementierung von Datensätzen".
Nachfolgend finden Sie die XML -Persistenz des mit TMDatasetproxy implementierten Datensatzes. Es beseitigt die Mühe, TCLIENTDATASET zu verwenden, und verwendet die Methode zur Aufzeichnung von Feldern mit Knoten. Obwohl die auf diese Weise generierte XML -Datei etwas größer ist, sind auch die Vorteile offensichtlich, insbesondere die XML, die ich in Webanwendungen verwenden möchte, und im Knoten aufgezeichnet ist, wird bei Verwendung von XSLT viel bequemer.
Prozedur tmdatasetproxy.loadfromxml (Anode: ixmlnode); var i, j: Integer; Childnodes [j]; [Widestring (Pinfo^.Name) Während für den Prow: = Anode.addchild ('Row'); ) Prow.addchild (widestring (pinfo^.Name) .Text: = GetVariante (i);Im Folgenden finden Sie eine einfache Demo, die die XML -Persistenz des Datensatzes enthält. Beachten Sie, dass das Mitarbeitermitglied beim Lasten mit Adodataset2 verbunden ist, das mit einer Tabelle mit diesen Feldern verbunden ist. Nach Abschluss der Last wird der Inhalt dieser Felder in der Mitarbeitertabelle in diese Tabelle kopiert.
TDemocompany = Klasse (TPersistent) FEMPERSCHAFT: Tform1.Saveclick (Absender: Tobject); var Demo: tDemocompany; ; Demo.Anlyee: = nil; Versuchen Sie Xmldocument1.Active: = true; Text: = inttoStr (Demo.Code); Subitems.Add (Demo.Anlyee.LastName); .
Schließlich kann ich mich von der störenden XML -Datenbindung verabschieden, und ich muss in Zukunft nicht XSD schreiben - obwohl es nützliche Tools gibt, ist es besser, einige Probleme zu sparen.