Como generar un archivo xml que cumpla con un XML Schema con GeneXus.

Un patrón bastante común con el que me he encontrado en varias aplicaciones GeneXus que intercambian datos, es el de tener que generar un archivo XML con un formato que cumpla con un XML Schema.

La aplicación con la que nos queremos comunicar, nos brinda un archivo de extensión XSD y debemos generar un XML con los datos de mi aplicacion que tenga dicho formato. 

Una forma fácil y de poco código que utilizo es la siguiente. 

Importar XSD a GeneXus. 

Haciendo Tools / Application Integration / XML Schema Import




Con esto, va a generar un SDT con el formato equivalente al del Schema.
Debemos revisar que el SDT tenga los tipos de datos correctos, pues puede haber algunos no soportados por Genexus o que hayan quedado mal. 

Generar un Data Provider con ese SDT de salida. 

El segundo paso es generar un Data Provider, que tenga el SDT recien importado como salida. La tarea de ese DP va a ser leer la base de datos y cargar el SDT con datos. 

Este paso implica solo crear el DP y poner en la propiedad Output el SDT recien creado. 

Tambien se puede hacer, creando el DP y arrastrando desde el KB Explorer en SDT al Source del Data Provider.  Esto va a poner el nombre del SDT en la propiedad Output y a generar el código correspondiente del data provider 


Editar el Data Provider. 
En esta etapa lo que hay que hacer es sustituir los comentarios del paso anterior, por atributos de la base de datos. El lenguaje de los Data Providers es poderoso, pero la sintaxis no es trivial y lleva un poco de practica acostumbrarse. Hay que entender que cada bloque {} es como si fuera un for each, por lo tanto hay que tener cuidado de no estar haciendo cortes de control indeseados. 

Por ejemplo si tenemos en el data provider:




Pero la tabla que va a acceder es mas plana:

Tabla Operaciones
OperacionID*
OperacionFecha
OperacionCodigo
EmpresaTipoDocumento
EmpresaNroDocumento

Si sustituyo todos los valores por sus atributos mas directos, voy a tener una navegacion incorrecta, pues se hara un corte de control en la tabla de Operaciones. 

Para obtener la carga correcta del SDT, hay varias formas de hacerlo, pero una fácil es utilizar variables de la forma: 

Así solo va a acceder una vez a la tabla de Operaciones y va a grabar correctamente el SDT. 

Pueden necesitarse usar SubGroups o llamar a otros Data Providers si la estructura es compleja o las tablas que debo navegar no están relacionadas. 

Generar el XML. 

Una vez que ya se tiene el DP con la navegación deseada, se puede poner parámetros y condiciones para que devuelva los registros que deseamos y una vez que se tiene esto, general el XML, es simplemente hacer

&SDT = DataProvider(&Parametros)

El SDT es el del primer paso y el DataProvider es el que creamos recién. 
Con esto, en &SDT.ToXML() tendremos un XML con los datos de nuestra aplicación, con el formato del Schema que nos brindaron, que se puede generar con muy poco código. 

Puede necesitarse alguna modificación adicional, en caso de tener que manejar namespaces, o que algún elemento del XML no deba aparecer si es nulo y esas personalizaciones, pero muchas de las mismas se pueden hacer en las propiedades de los elementos del SDT. 




Comentarios

  1. Hola Enrique.
    Yo genero un XML con el DP, pero tengo el inconveniente que no puedo agregar un atributo al elemento de inicio.
    Esto es lo que deberia tener



    .
    .

    Si en la propiedad Exposed Name del SDT se lo escribo, crea el primer elemento , pero al tag de cierre también le coloca el atributo version.
    Y no estaría cumpliendo con el protocolo requerido.
    ¿Se puede agregar manualmente el atributo al elemento inicial cuando se genera el XML?
    Gracias!

    ResponderBorrar
    Respuestas
    1. Truskatron, no se ve cual es el xml pues Blogger saca los tags.
      Siempre se puede generar un xml con el formato que se quiere, pues tenemos las primitivas para hacerlo. Puede dar mas o menos trabajo, dependiendo de que tan sofisticado o rebuscado sea el formato.

      Borrar
  2. Buen artículo, desconocía la sintaxis del lenguaje de Data Providers.

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.