通过 TCP/IP 接收数据时 HL7V2 HAPI 解析器异常

如何解决通过 TCP/IP 接收数据时 HL7V2 HAPI 解析器异常

我正在使用版本 2.3 的 HAPI hapi-structures-v25 库来解析 HL7v2 消息并将其转换为 FHIR 资源。我在通过 TCP 侦听器使用 HAPI 接收和解析 HL7V2 消息时遇到一个奇怪的问题。

确定消息的编码。以下是消息的前 50 个字符以供参考,尽管这可能不是问题所在:MSH|^~\&|test|DrJhonDoe|TEST|UNKNowN|20210216190432||ADT^A01^ADT_A01|60b647d4-b5a5 -4fae-a928-d4a3849de3c8|T|2.5

奇怪的是,当我尝试在主函数中将此消息作为字符串发送时没有收到此错误。仅当我通过 TCP/IP 将数据接收到我的 Java 函数时才会收到此错误。我尝试使用 Mirth 以及外部工具将 HL7 消息发送到我的接收 TCP 端口,结果相同。

这是我尝试处理的 HL7v2 消息示例

MSH|^~\\&|test|Dr.JhonDoe|TEST|UNKNowN|20210216190432.7||ADT^A01^ADT_A01|60b647d4b5a54faea928d4a3849de3c8|T|2.5
EVN||20210216|20210216|

TCP/IP 接收数据时,我使用 UTF-8 字符集将字节转换为字符串。

InputStream in = connection.getInputStream();
OutputStream out = connection.getoutputStream();
receivedMessageSize = in.read(receivedByeBuffer);
String incomingHl7Message = new String(receivedByeBuffer,StandardCharsets.UTF_8);

我正在正确接收消息。但不知道为什么会出现错误

解决方法

正如Amit在回答中提到的,它需要在JAVA中进行转义。通过 MLLP 传输的 HL7v2 将 <VT>,<CR> Unicode 数据添加到文本中。这里需要理解的是,这些不是垃圾字符。根据MLLP协议,消息的开始和结束由这些unicode字符标记来描述一个帧的开始和结束。

HAPI HL7 解析无法解析这些特殊(不可打印)字符。很高兴我在同一个论坛上找到了一个解决方案来明智地在 Java 中处理它。 How to remove control characters from java string?

一个简单的正则表达式将完成如下所示的技巧:

.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]","");

还要确保您编码的字符也能用 JAVA 正确处理。通常 JAVA 不擅长处理反斜杠。所以,转义反斜杠 .replace("\\","\\\\")

这样就可以了。

,

正如您所提到的,您正确地收到了消息,我认为这与 HL7 无关。我的第一个猜测是这可能是与字节到字符串转换相关的问题。

但是,在评论中与您讨论时,您说导致问题的字符串中存在 MLLP 字符。

我知道一些 MLLP 解析器删除了 MLLP 字符 (<VT>,<FS>,<CR>);但有些没有。应用程序应删除它们。

在将字节转换为字符串之后,在调用 parser.parse(hl7Message) 之前,只需使用 Java 中的一些字符串替换方法删除这些字符。

我不懂 java,但像 hl7Message.replace(....,"") 这样的东西应该可以工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?