
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!
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 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 …
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:
Carga útil del cuerpo de prueba
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.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073