• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
  • Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
Twitter Linkedin Instagram

S4PCADEMY_Logo
  • Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
Twitter Linkedin Instagram
#migration  ·  groovy script for CPI  ·  HL7 FHIR  ·  hl72xml  ·  Technical Articles  ·  xml2hl7

Convertidor XML HL7 con script Groovy (Integration Suite) y bibliotecas externas

By s4pcademy 


Hola mi nombre es Raúl y soy un apasionado de las Integraciones SAP.

En este blog, el primero, les mostraré una manera fácil de convertir de XML a HL7 y viceversa. Esperemos que resulte útil si está migrando algún formulario de integración PI/PO a Integration Suite.

Hoy en día en el menú Convertidores no hay una opción XML <-> HL7, así que ¡vamos!

Convertidor%20opciones Opciones disponibles del convertidor

En primer lugar, tenemos que descargar el hapibase biblioteca (hapi-dist-2.2-all.zip) desde el siguiente enlace: https://sourceforge.net/projects/hl7api/files/hl7api/2.2/

Tienen muchos ejemplos de código interesantes, preguntas frecuentes, lista de correo, etc.

Una vez que haya descargado el archivo, agréguelo a los Recursos:

Archivos%20cargados%20a%20Recursos

Archivos subidos a Recursos

Bien, ahora el el trabajo duro está hecho… solo queda elegir una opción: convertir de XML a HL7 (A) o de HL7 a XML (B).

A) XML a HL7

Como es solo un blog educativo, hagámoslo simple, solo 2 pasos …

  • El primer paso es un modificador de contenido, es necesario porque el espacio de nombres original del xml debe reemplazarse con “urna:hl7-org:v2xml” entonces creamos una propiedad llamada input_namespace y externalizarlo para cambiarlo fácilmente (el reemplazo se realiza en el siguiente paso).

Espacio de nombres%20Excepción

  • El segundo paso es el guión Groovy. Es realmente simple… obtenga el cuerpo, limpie el cuerpo, analice y codifique el cuerpo y configure el cuerpo codificada (o la excepción) para el mensaje.
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.EncodingNotSupportedException;
import ca.uhn.hl7v2.parser.Parser;
import ca.uhn.hl7v2.parser.GenericParser;
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;

def Message processData(Message message) {
    
    def String body_enconded = "";
    def body = message.getBody(java.lang.String);
    
    //Instantiate parser
    HapiContext context = new DefaultHapiContext();
    GenericParser parser = new GenericParser(context);

          try {
            
            //First clean the XML
            body = cleanXML(body, message);
            //and then parse method performs the actual parsing & encoding
            ca.uhn.hl7v2.model.Message msg = parser.parse(body);
            body_enconded = parser.encode(msg);
              
          } catch (EncodingNotSupportedException e) {
            body_enconded =  "EncodingNotSupportedException: " + e.toString();
          } catch (HL7Exception e) {
            body_enconded = "HL7Exception: " + e.toString();
          }
    
    message.setBody(body_enconded);
    return message;
    
}

def java.lang.String cleanXML(java.lang.String xml_str, Message message) {       
    
    //get externalized parameter and replace it
    def map = message.getProperties();
    def String input_namespace = map.get("input_namespace");
    
    xml_str = xml_str.replaceAll("<", "<");
    xml_str = xml_str.replaceAll(">", ">");
    xml_str = xml_str.replaceAll("&", "&");
    xml_str = xml_str.replaceAll("<n0:", "<");
    xml_str = xml_str.replaceAll("</n0:", "</");
    xml_str = xml_str.replaceAll(input_namespace, "urn:hl7-org:v2xml");
    xml_str = xml_str.replaceAll("xmlns:n0=\"urn:hl7-org:v2xml\"", "xmlns=\"urn:hl7-org:v2xml\"");
    return xml_str;
    
}

La captura de excepciones es útil y nos da pistas sobre lo que podría estar fallando, es decir:

Así que probemos nuestro escenario haciendo una simulación:

Prueba%20cuerpo%20carga útil

Carga útil del cuerpo de prueba

Resultado%20cuerpo%20codificado

Cuerpo de resultado codificado

B) HL7 a XML

En este caso, sólo tiene un paso porque no es necesario reemplazar el espacio de nombres antes de la codificación y la modificación de XML después de la codificación no es el objetivo del blog.

Groovy script se ve así:

import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.PipeParser;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.parser.EncodingNotSupportedException;
import ca.uhn.hl7v2.parser.XMLParser;
import ca.uhn.hl7v2.parser.DefaultXMLParser;
import com.sap.gateway.ip.core.customdev.util.Message;

def Message processData(Message message) {
    
    //Body
    def java.lang.String body = message.getBody(java.lang.String);

    def java.lang.String XML = "";
    HapiContext context = new DefaultHapiContext();    
    XMLParser xmlParser = (XMLParser)new DefaultXMLParser();
    PipeParser pipeParser = new PipeParser();
 
    try {
    // The parse method performs the actual parsing
    XML = xmlParser.encode(pipeParser.parse(body));   

    } catch (EncodingNotSupportedException e) {
        XML =  "EncodingNotSupportedException: " + e.toString();
    } catch (HL7Exception e) {
        XML = "HL7Exception: " + e.toString();
    } 
    
    message.setBody(XML);
    return message;
}

La parte complicada aquí es que la carga útil necesita un Separador de segmentos HL7 (\r = Retorno de carro) al final de cada segmento. Entonces, para fines de prueba, creo un archivo con saltos de línea Mac.

Probando la carga útil de HL7:

Cuerpo codificado en xml:

¡Gracias por leer mi primer blog! Espero que haya valido la pena llegar hasta aquí. Cualquier comentario o retroalimentación será bienvenido.

Hasta pronto, Raúl.



Source link


BibliotecasconConvertidorexternasGroovyHL7IntegrationScriptSuiteXML

Artículos relacionados


Event Information
Acelere la transformación de su negocio y reduzca el tiempo de generación de valor con SAP Business Technology Platform
#ibp #gitacloud #sap #sapibp #sapcommunity #xpa #sop #fpa #controltower #planning #integratedbusinessplanning #education #video  ·  Product Information
Cómo integrar sus procesos S&OP y FP&A con un único modelo de planificación unificado en SAP IBP
Technical Articles
Determinación de impresora dinámica con múltiples copias en CRM PPF Action Profile

Deja tu comentario Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

Jornada do Parceiro – Da construção de Propriedade Intelectual no SAP BTP à SAP Store
Previo
SAPinsider 2023: diez mejores opciones para SAP BTP
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.
Cookies Para que este sitio funcione adecuadamente, a veces instalamos en los dispositivos de los usuarios pequeños ficheros de datos, conocidos como cookies. La mayoría de los grandes sitios web también lo hacen.
Aceptar
Cambiar ajustes
Configuración de Cookie Box
Configuración de Cookie Box

Ajustes de privacidad

Decida qué cookies quiere permitir. Puede cambiar estos ajustes en cualquier momento. Sin embargo, esto puede hacer que algunas funciones dejen de estar disponibles. Para obtener información sobre eliminar las cookies, por favor consulte la función de ayuda de su navegador. Aprenda más sobre las cookies que usamos.

Con el deslizador, puede habilitar o deshabilitar los diferentes tipos de cookies:

  • Bloquear todas
  • Essentials
  • Funcionalidad
  • Análisis
  • Publicidad

Este sitio web hará:

Este sitio web no:

  • Esencial: recuerde su configuración de permiso de cookie
  • Esencial: Permitir cookies de sesión
  • Esencial: Reúna la información que ingresa en un formulario de contacto, boletín informativo y otros formularios en todas las páginas
  • Esencial: haga un seguimiento de lo que ingresa en un carrito de compras
  • Esencial: autentica que has iniciado sesión en tu cuenta de usuario
  • Esencial: recuerda la versión de idioma que seleccionaste
  • Functionality: Remember social media settings
  • Functionality: Remember selected region and country
  • Analytics: Keep track of your visited pages and interaction taken
  • Analytics: Keep track about your location and region based on your IP number
  • Analytics: Keep track of the time spent on each page
  • Analytics: Increase the data quality of the statistics functions
  • Advertising: Tailor information and advertising to your interests based on e.g. the content you have visited before. (Currently we do not use targeting or targeting cookies.
  • Advertising: Gather personally identifiable information such as name and location
  • Recuerde sus detalles de inicio de sesión
  • Esencial: recuerde su configuración de permiso de cookie
  • Esencial: Permitir cookies de sesión
  • Esencial: Reúna la información que ingresa en un formulario de contacto, boletín informativo y otros formularios en todas las páginas
  • Esencial: haga un seguimiento de lo que ingresa en un carrito de compras
  • Esencial: autentica que has iniciado sesión en tu cuenta de usuario
  • Esencial: recuerda la versión de idioma que seleccionaste
  • Functionality: Remember social media settings
  • Functionality: Remember selected region and country
  • Analytics: Keep track of your visited pages and interaction taken
  • Analytics: Keep track about your location and region based on your IP number
  • Analytics: Keep track of the time spent on each page
  • Analytics: Increase the data quality of the statistics functions
  • Advertising: Tailor information and advertising to your interests based on e.g. the content you have visited before. (Currently we do not use targeting or targeting cookies.
  • Advertising: Gather personally identifiable information such as name and location
Guardar y cerrar