No ano passado, passei muito tempo tentando desenvolver aplicativos da Web baseados em XML com a Delphi. A ideia inicial foi linda, mas o resultado foi que as coisas eram muito simples. Parte do motivo é que a implementação da ligação de dados entre XML e objeto é muito problemática (a outra parte é que ele não está familiarizado com o XSLT e leva muito tempo para aprendê -lo).
Eu sempre usei a ligação de dados XML fornecida pelo Delphi. Obviamente, é muito conveniente depois de gerar. Mas o problema é que sempre haverá algumas alterações durante o processo de desenvolvimento do programa. muito problemático.
Então, quando penso em objetificação do conjunto de dados, acho imediatamente que também posso usar o RTTI para implementar a persistência XML do objeto - na verdade, a implementação do SOAP iniciada com o Delphi6 é usar o RTTI para implementar a conversão de dados de objeto em SOAP ( isto é, xml). Obviamente, eu já estava muito tarde. Trabalhe há alguns anos, e imediatamente pedi seu código -fonte. O Lexlib é uma biblioteca com muitas funções que se parecem um pouco com a biblioteca de classes básicas do .NET (é claro que não é tão grande ^o ^). Como eu só preciso dessa parte, não há necessidade de usar tantos problemas para toda essa biblioteca. concluir:
TMXMLPERSISTENT = CLASS (TOBJECT) Procedimento de classe Public LoadObjfromxml (ânodo: ixmlnode; AOBJ: tpersSistent); TRING , tkset, tkwchar, tklstring, tkwstring, tkint64]; {tmxmlpersistent} procedimento de classe tmxmlpersistent.loadobjfromxml (ânodo: ixmlNode; Comece se ( AOBJ é tmdataSetProxy) então (AOBJ como tmdatasetProxy) .LoadFromxml (ânodo) Else BEGIN PLIST: = tmProplist.Create (AOBJ); ; anode.childnodes [widestring (pinfo^.name)], tmpobj como tpersistent); Pinfo. Ppropinfo; pinfo: = plist.props [i]; (tmpobj é tpersSistent)) Em seguida, SaveObjToxml (anode.addchild (widestring (pinfo^.name)), tmpobj como tpersistent); ^ .Nome) .Text: = GetPropValue (AOBJ, pinfo^ .Name);Essa implementação deve ser considerada muito simples. Existem principalmente três partes (a estrutura de carga e salvamento é semelhante):
Primeiro, o processamento especial é feito para o TMDatasetProxy e confiar essa classe para lidar com sua própria implementação. .
O segundo é processar recursivamente a classe e, é claro, suporta apenas a classe derivada do tpersistente.
Terceiro, o campo geral é simplesmente convertido em string e salvo, que toma tomando o filtro do lexlib e apenas processa tipos de dados que podem ser simplesmente convertidos para string, filtrando esses tipos que podem causar erros de conversão.
Para o TMProplist usado no código acima, consulte a implementação em "Usando o RTTI da Delphi para implementar conjuntos de dados".
Abaixo está a persistência XML do conjunto de dados implementado com o TMDatasetProxy. Ele elimina o problema de usar o TclientDataSet e usa o método de gravação campos com o nó. Embora o arquivo XML gerado dessa maneira seja um pouco maior, os benefícios também são óbvios, especialmente o XML que estou planejando usar em aplicativos da Web e gravado no nó será muito mais conveniente ao usar o XSLT.
Procedimento TMDataSetProxy.LoadFromxml (ânodo: ixmlnode); Var I, J: Inteiro; Childnodes [j]; [Wideestring (Pinfo^.Nome) Enquanto foreach, comece a proa: = Anode.addchild ('linha'); ) Então prow.Addchild (Widestring (Pinfo^.Name).Abaixo está uma demonstração simples que inclui a persistência XML do conjunto de dados. Observe que, quando carregar, o membro do funcionário está conectado ao Adodataset2, que está conectado a uma tabela que contém esses campos. Após a conclusão da carga, o conteúdo desses campos na tabela de funcionários será copiado para esta tabela.
TDemocompania = classe TPERSISTENTE) Femployee: TDSPEMPLAYE; TForm1.Saveclick (remetente: Tobject); VAR Demo: TDemocompania; TRUMO; DemoMO.Employee: = NIL; Tente xmldocument1.Activing: = true; Texto: = inttostr (Demo.code); SubItems.Add (Demo.Employee.LastName); .Free;
Por fim, posso dizer adeus à problemática ligação de dados XML e não preciso escrever XSD no futuro - embora haja ferramentas úteis, é melhor economizar alguns problemas.