lunes, 22 de febrero de 2016

Leer XML desde un String

Bueno el objetivo de esta entrada es permitir leer un XML desde un string (que puede ser obtenido mediante un Archivo o un Web Service, que no será tratado en la misma) y mediante el uso del Data type XMLReader procesarlo para que pueda ser usado en un SDT y todas las ventajas que este ofrece. Sin más que acotar empecemos.

Se declaran las variables:
  • mensaje de tipo Varchar(200) o LongVarChar (2M) dependiendo del tamaño del texto. Esta variable contendrá el XML en forma de cadena de caracteres o de String.
  • XMLReader de tipo XMLReader. Este tipo de objeto permitirá crear un lector para el procesamiento del formato XML. click aquí para más información.
  • XML de tipo Varchar(200) o LongVarChar (2M) dependiendo del tamaño del texto, esta variable almacenará el XML crudo como String o cadena.
  • SDT de tipo del SDT especialmente construido para guardar la información del XML.

Y mediante el código fuente a explicar:

Básicamente en las variables anteriores ya se definió el funcionamiento del siguiente código salvó la merecida explicación de las funciones Read() que permite procesar la información desde el string hacia el objeto XMLReader; y la función ReadRawXML() que permite enviar el contenido del lector como XML hacia una variable, para que esta pueda ser usada en el llenado del SDT con la función FromXML().

&XMLReader.OpenFromString(&mensaje)
&XMLReader.Read()
&XML = &XMLReader.ReadRawXML()
&SDT.FromXml(&XML)

12 comentarios:

  1. Muchas gracias por la información, claro y conciso.

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Hola, buenas noche o tardes...
    Necesito desarrollar una aplicación donde en un WBP, debo ingresar a un carpeta y seleccionar archivos con extensión".xml" y tratarlos con el tipo de dato XMLReader.
    El tema es que no sé como tener en el WBP, un acceso a la carpeta donde se guardan los archivos del "Input File" o algo así. Puesto que en los ejemplos que encontré; &varXMLRead.Open(&RutaArchivo) por ejemplo ya tiene definida la ruta y el nombre del Archivo.
    La idea es que yo pueda acceder a esa ruta poder abrir la carpeta donde están los ".xml" seleccionarlo y descargar en una Grilla o SDT el contenido del mismo. Tratándolo con el Tipo de Datos XMLReader utilizando sus método y propiedades.
    La verdad estoy tratando de buscarle la vuelta pero no puedo lograrlo.
    Si es posible me de una guía se lo voy a agradecer.
    Muchas gracias un saludo cordial.

    ResponderEliminar
    Respuestas
    1. Buenos días,

      No sé si ya lograste resolver el problema que tenías o tal vez llegue muy tarde mi respuesta.

      Lo que podrías hacer es usar el tipo de objeto Directory de Genexus (setear el path respectivo) y mediante la función o método GetFiles obtener los archivos que necesitas procesar usando un bucle.

      Saludos,

      Eliminar
    2. Hola Byron, buen día.
      Si efectivamente seguí tu consejo y pude resolver el problema. Ahora se descargan todos los archivos como quería.
      Muchas gracias

      Eliminar
  4. Estimado Byron sobre el ejemplo de SDT llenado a partir de un XML, podrias por favor indicarnos la estructura del XML y del SDT ya que necesito hacer algo similar, pero ne me funciona por que no se exactamente como deben estar las estructuras mencionadas, agradecería mucho si me puedes ayudar.

    ResponderEliminar
    Respuestas
    1. Estimado Dennys, respecto a la estructura del xml y de del SDT lo que debes tomar en cuenta es:

      1. El nombre de los tags del xml y replicarlos en tu SDT.
      2. Analizar el tipo de dato (número, texto u otros) de cada tag del xml y de manera similar replicarlo en el SDT (en los tipo de datos de las variables).
      3. Si los datos del XML son una colección, de manera similar elegir la estructura adecuada para tu SDT, es decir si va a ser una variable de tipo SDT y la conviertes en Collection al invocarla en tu programa (en la sección de Variables) o si desde el editor del SDT tienes un item tipo Collection.

      PD: Te puede servir imprimir un SDT llenado aleatoriamente con la función ToXML para verificar si la estructura del SDT se adapta al XML que quieres consumir.

      Puedes revisar estos dos enlaces:

      1. Para ver un ejemplo pequeño de estructura sencillo: https://wiki.genexus.com/commwiki/servlet/wiki?7251,Xml+Type+Property+%28SDT%29,

      2. Un problema concreto en star overflow de alguien con un problema similar y un ejemplo(incluso hay un xpz de ejemplo de SDT, aunque es para la versión Ev3 de Genexus): https://es.stackoverflow.com/questions/26366/como-utilizar-el-m%C3%A9todo-toxml-en-genexus

      Eliminar
    2. Espero te sea de ayuda.

      Saludos.

      Eliminar
  5. Buen día...
    Con respecto al ejemplo ...
    La ruta del archivo XML se le asigna a la variable &mensaje?
    Pregunto puesto que hay que ir a buscar el archivo en el path donde se aloja.
    Es así?
    Saludos

    ResponderEliminar
    Respuestas
    1. Buen día,

      La variable mensaje tiene el xml en string, es decir que previamente ya se leyó el archivo xml (con el objeto file de genexus por ejemplo). Si se necesita abrir o ubicar el archivo xml para procesarlo (obtener su contenido) puedes ver el siguiente enlace donde te habla un poco de como hacerlo (función ReadAllText).

      https://wiki.genexus.com/commwiki/servlet/wiki?24070,File+data+type%3A+Text+file+handling,

      Eliminar
  6. Hola BYRON (again)
    Estoy haciendo una pruevas con el ejemplo que mostrás.
    Pero tengo un inconveniente:
    en &SDT.FromXml(&XML) no muestra nada ni siquiera si hay algún error. Es raro ...
    Que puede ser?
    Saludos

    ResponderEliminar