【问题标题】:How to parse a HL7 message string properly?如何正确解析 HL7 消息字符串?
【发布时间】:2020-12-29 02:54:24
【问题描述】:

我正在使用 NHAPI 包将传入的消息字符串解析为使用 PipeParser 的 HL7 IMessage 接口。

基于HL7 Minimum Layer Protocol (MLP) 定义,HL7 消息总是由一些字符包裹,0x0b 开头,0x1c, 0x0d 结尾。出于测试目的,我使用工具 7Edit 将此消息发送到我的应用程序。

MSH|^~\&|KISsystem|ZTM|NIDAklinikserver|HL7Proxy|201902271130||ADT^A01|68371142|P|2.3
EVN|A01|201902271130|201902271130
PID|1||677789||Aubertinó^Letizia||19740731|F||
PV1|1|O|||||||||||||||||456456456
IN1|1||999567890|gematik Musterkasse1GKV||||||||||||Prof. Dr.Aubertinó^Letizia||19740731|||||||||||201902271101|||||||X110173919

调试的消息字符串是

MSH|^~\&|KISsystem|ZTM|NIDAklinikserver|HL7Proxy|201902271130||ADT^A01|68371142|P|2.3
EVN|A01|201902271130|201902271130
PID|1||677789||Aubertin�^Letizia||19740731|F||
PV1|1|O|||||||||||||||||456456456
IN1|1||999567890|gematik Musterkasse1GKV||||||||||||Prof. Dr.Aubertin�^Letizia||19740731|||||||||||201902271101|||||||X110173919

在这里您可以看到包裹消息的字符。如果您将此消息字符串传递给PipeParser.Parse() 方法,它将抛出带有消息的异常

无法解析消息开头 MSH|^~&|KISsystem|ZTM|NIDAklinikserver|HL7Proxy|

我想我必须先删除所有这些字符。有什么东西可以使用还是我必须将所有这些分隔符存储到一个字节数组中,将此字节数组转换为字符串并从消息字符串中删除这些分隔符字符串?

【问题讨论】:

  • 您是如何获得要放入 7Edit 的原始 HL7 消息的?如果您正在从浏览器窗口或其他应用程序中进行复制粘贴,有时可能会在其中添加您看不到的字符以使其显示良好。我在连接字符串中遇到过这种情况,它用字符 (0xC2) 替换空格字符 (0x20)。
  • 我认为您使用了错误的工具。这是几种不同格式的 HL7 数据。看起来您的数据来自血液分析仪等设备。 NHAPI 包同时支持管道和 xml。确保您使用正确的参数。请参阅:nhapi.sourceforge.net/home.php

标签: c# nhapi


【解决方案1】:

以前从未使用过 NHAPI,但我经常处理 HL7 消息和接口。

您必须清理您获得的数据,因此您删除字符的假设是正确的。这些字符算作空格,因此简单的 Trim() 可以工作。我们的客户有时会随机在消息前面加上特殊字符和双引号,这样总是很有趣。但在这种情况下,修复非常简单。

下面的代码在我这边解析消息。

string message2 = @"MSH|^~\&|KISsystem|ZTM|NIDAklinikserver|HL7Proxy|201902271130||ADT^A01|68371142|P|2.3
                            EVN|A01|201902271130|201902271130
                            PID|1||677789||Aubertin�^Letizia||19740731|F||
                            PV1|1|O|||||||||||||||||456456456
                            IN1|1||999567890|gematik Musterkasse1GKV||||||||||||Prof. Dr.Aubertin�^Letizia||19740731|||||||||||201902271101|||||||X11017391";

var ourPP = new PipeParser();

try
{
    //exception is thrown without the Trim(); No exception with the Trim()
    var hl7Message = ourPP.Parse(message2.Trim());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
Console.ReadKey();

【讨论】:

  • 哦,该死的,Trim 确实有效……但总是如此吗? :D
  • 是的,应该。它只是修剪 0x0b0x1c, 0x0d,如果您以相同的方式接收它们,它们将出现在每条 HL7 消息中。
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2011-04-14
  • 2012-05-28
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多