PDA

Ver la Versión Completa : Creando interface XML con XML DataBinding


cmfab
09-09-2017, 20:59:30
Estimados, buenas tardes a todos !. a ver si alguien puede echarme una mano.

He creado una plantilla de un documento XML para después poder importarlo a un proyecto con el objetivo de crear los objetos y poder leerlo desde una aplicación cliente de un WebServices.

La estructura es sencilla:

<ServiceList>
<id_service>1</id_service>
<alias>"SERV1"</alias>
<name_service>"SERVICIO1"</name_service>
<id_service>2</id_service>
<alias>"SERV2"</alias>
<name_service>"SERVICIO2"</name_service>
</ServiceList

una vez que creo el documento uso la opción de delphi "XML DantaBinding" y lo que me está sucediendo es que los valores de alias y service_name me los toma como una colección o array de tipo de datos Integer al crear la interface.

{ IXMLServiceListType }

IXMLServiceListType = interface(IXMLNode)
['{E1B6D7EE-7CE9-41A7-8CEE-6EC032EC845C}']
{ Property Accessors }
function Get_Id_service: IXMLIntegerList;
function Get_Alias: IXMLIntegerList;
function Get_Name_service: IXMLIntegerList;
{ Methods & Properties }
property Id_service: IXMLIntegerList read Get_Id_service;
property Alias: IXMLIntegerList read Get_Alias;
property Name_service: IXMLIntegerList read Get_Name_service;
end;

{ IXMLIntegerList }

IXMLIntegerList = interface(IXMLNodeCollection)
['{D12E15F7-DC94-4604-84FB-C50DD255BDA1}']
{ Methods & Properties }
function Add(const Value: Integer): IXMLNode;
function Insert(const Index: Integer; const Value: Integer): IXMLNode;

function Get_Item(Index: Integer): Integer;
property Items[Index: Integer]: Integer read Get_Item; default;
end;

{ Forward Decls }

TXMLServiceListType = class;
TXMLIntegerList = class;

{ TXMLServiceListType }

TXMLServiceListType = class(TXMLNode, IXMLServiceListType)
private
FId_service: IXMLIntegerList;
FAlias: IXMLIntegerList;
FName_service: IXMLIntegerList;
protected
{ IXMLServiceListType }
function Get_Id_service: IXMLIntegerList;
function Get_Alias: IXMLIntegerList;
function Get_Name_service: IXMLIntegerList;
public
procedure AfterConstruction; override;
end;

{ TXMLIntegerList }

TXMLIntegerList = class(TXMLNodeCollection, IXMLIntegerList)
protected
{ IXMLIntegerList }
function Add(const Value: Integer): IXMLNode;
function Insert(const Index: Integer; const Value: Integer): IXMLNode;

function Get_Item(Index: Integer): Integer;
end;


Da igual si en el xml tengo las comillas o no, siempre me toma los tres campos como enteros. alguna idea ?. Gracias.

cmfab
09-09-2017, 21:00:33
Disculpen por usar mal la etiqueta en el XML, la información sería esta:

<ServiceList>
<id_service>1</id_service>
<alias>"SERV1"</alias>
<name_service>"SERVICIO1"</name_service>
<id_service>2</id_service>
<alias>"SERV2"</alias>
<name_service>"SERVICIO2"</name_service>
</ServiceList

cmfab
09-09-2017, 21:14:00
Me autorespondo.

He cambiado en la interface el tipo de datos manualmente que retornan los valores de los campos del XML y me ha
funcionado bien. serían estos los cambios:

function Get_Item(Index: Integer): WideString;
property Items[Index: Integer]: WideString read Get_Item; default;

AgustinOrtu
09-09-2017, 22:59:55
Podes cambiarlo manualmente o mientras estas con el wizard te da la opcion de definir el tipo de datos

Ten en cuenta que el asistente lo que hace es tratar de "adivinar", interpretando el xml, cual seria el tipo de datos mas adecuado, si le das el valor 1 lo mas logico es que lo tome como integer

cmfab
10-09-2017, 15:15:41
Gracias, pero ya lo había intentado y solo me despliega en los tres campo el tipo "Integer", quizá no lo esté haciendo correctamente yo le doy click al botón opciones del asistente pero no estoy claro de como hacer los cambios, podrías explicarlo ?. Gracias

tmsanchez
11-09-2017, 17:57:56
Probablemente este enfoque (usando RTTI) te sea de utilidad.

http://robstechcorner.blogspot.mx/2009/10/xml-serialization-basic-usage.html

Sería cuestión de que verificaras el tipo de dato para llenaro de forma correcta.

Saludos.

cmfab
12-09-2017, 14:32:21
Muchas Gracias, lo revisaré a la brevedad. Saludos !