El año pasado pasé mucho tiempo tratando de desarrollar aplicaciones web basadas en XML con Delphi. La idea inicial era hermosa, pero el resultado fue que las cosas eran muy simples. Parte de la razón es que la implementación de la unión de datos entre XML y objeto es demasiado problemática (la otra parte es que no está familiarizada con XSLT y lleva mucho tiempo aprenderlo).
Siempre he usado el enlace de datos XML proporcionado por Delphi. Por supuesto, es muy conveniente una vez que se genera en el programa, solo necesito operar esta interfaz. Pero el problema es que siempre habrá algunos cambios durante el proceso de desarrollo del programa. Muy problemático.
Entonces, cuando pienso en la objetivación del conjunto de datos, inmediatamente creo que también puedo usar RTTI para implementar la persistencia XML de Object; de hecho, la implementación de SOAP comenzó con Delphi6 es usar RTTI para implementar la conversión de Object a SOAB Data ( es decir, xml). Obviamente ya llegué muy tarde. Trabajo hace unos años, e inmediatamente le pedí su código fuente. Lexlib es una biblioteca con muchas funciones que se parece un poco a la biblioteca de clase básica de .NET (por supuesto, no tan grande. Debido a que solo necesito esta parte, no hay necesidad de usar esta biblioteca completa tantos problemas. lograr:
TMXMLPERSISTENT = CLASE (TOBJET) PROCEDIMIENTO DE LA CLASE PÚBLICA ingerido , tkshet, tkwchar, tklString, tkwString, tkint64]; {TMXMLPERSISTENT} PROCEDIMIENTO DE CLASE TMXMLPERSISTEN ; Aobj es tmdataSetProxy) luego (aobj como tmdataSetProxy) .LoadFromXml (anódico) de lo contrario comienza plist: = tmproplist.create (aobj); ; Si (pinfo^.propType^.kind = tkclass) luego comience tmpobj: = tobject (integer (getPropValue (aobj, piNFO^.name))); anode.childnodes [wideString (pinfo^.name)], tmpobj como tpersistent); Pinfo^.name). Ppropinfo; pinfo: = plist.props [i]; (tmpobj es tpersistent)) luego saveObjToxml (anode.addchild (wideString (pinfo^.name)), tmpobj como tpersistent); ^ .Name).Se debe decir que esta implementación es muy simple. Hay principalmente tres partes (la estructura de carga y el ahorro es similar):
Primero, el procesamiento especial se realiza a TMDatasetProxy y confía en esta clase para manejar su implementación en sí. .
El segundo es procesar recursivamente la clase y, por supuesto, solo admite la clase derivada de tpersistente.
En tercer lugar, el campo general simplemente se convierte en cadena y se guarda, que toma prestado el filtro de Lexlib, y solo procesa los tipos de datos que simplemente se pueden convertir en cadena, filtrando esos tipos que pueden causar errores de conversión.
Para la TMProplist utilizada en el código anterior, consulte la implementación en "Usar RTTI de Delphi para implementar conjuntos de datos".
A continuación se muestra la persistencia XML del conjunto de datos implementado con TMDatasetProxy. Elimina el problema de usar TClientDataSet y utiliza el método de grabación de campos con nodo también usa este método, que es diferente del método de grabación de campos con atributo utilizado por TClientDataSet. Aunque el archivo XML generado de esta manera será un poco más grande, los beneficios también son obvios, especialmente el XML que planeo usar en aplicaciones web, y registrado en el nodo será mucho más conveniente cuando se usa XSLT.
procedimiento tmdataSetProxy.loadFromXml (anode: ixmlnode); var i, j: integer; Nodos de infancia [J]; [Widestring (Pinfo^. Mientras que el foreach comienza la prow: = anode.addchild ('fila'); ) Entonces prow.addchild (widestring (pinfo^.name) .text: = getVariant (i);A continuación se muestra una demostración simple que incluye la persistencia XML del conjunto de datos. Tenga en cuenta que cuando la carga, el miembro del empleado está conectado a Adodataset2, que está conectado a una tabla que contiene estos campos. Después de completar la carga, el contenido de estos campos en la tabla de empleados se copiará en esta tabla.
TDemocompany = class (Tpersistent) Femploye privado: TDSPEMPLAYEE; TForm1.saveClick (remitente: tobject); var demo: tdemocompany; ; demo.Employee: = nil; Pruebe xmlDocument1.Active: = true; Texto: = intToStr (demo.code); Subitems.Add (Demo.Employee.lastName); .Free;
Finalmente, puedo decir adiós al problemático enlace de datos XML, y no tengo que escribir XSD en el futuro; aunque hay herramientas útiles, es mejor ahorrar algunos problemas.