Java解析HL7消息进阶(解析自定义HL7消息)

el/2024/4/19 23:00:44

上一篇文章博主笼统的讲了HL7解析,以及解析完成的Message结构,详情移步👉(Java通过HAPI解析HL7消息),下面博主就来讲讲通过HL7如何解析自定义消息

HL7(详情)

Health Level Seven组织成立於1987年,由SamSchultz博士在宾夕法尼亚州大学医院主持的一次会议促成了HL7组织和通信标准的诞生。随着许多用户、厂商、顾问组织的加入,HL7队伍在逐渐壮大,于是成立了HL7工作组。(官网)

使用的HAPI(maven)

<dependency><groupId>ca.uhn.hapi</groupId><artifactId>hapi-base</artifactId><version>${hapi.version}</version>
</dependency>
<dependency><groupId>ca.uhn.hapi</groupId><artifactId>hapi-structures-v24</artifactId><version>${hapi.version}</version>
</dependency>

要解析的自定义消息

MSH|^~\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL
ZDS|999|九九九|20210315184009.925+0800

解析过程

1.解读HL7消息(我只给大家解读下解析消息需要注意的重点)

  • MSH段解读
    1. 这个自定义消息的名称是ZDY^RESZDY_RES
    2. 使用版本 2.4
  • ZDS段解读
    1. ZDS是个自定义段,段名为ZDS
    2. ZDS有三个字段:
      1. 999:NM(数字类型)
      2. 九九九:ST(字符串类型)
      3. 2021···:DTM(日期类型)

2.Java中创建自定义段

  • 重点:创建的位置com.example.HL7.v24.segment;
    • 上面需要解析的HL7消息的版本是2.4对应这里的v24
    • 这里自定义的是段Segment,对应这里的segment
package com.example.HL7.v24.segment;import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractSegment;
import ca.uhn.hl7v2.model.Group;
import ca.uhn.hl7v2.model.Type;
import ca.uhn.hl7v2.model.v24.datatype.NM;
import ca.uhn.hl7v2.model.v24.datatype.ST;
import ca.uhn.hl7v2.model.v25.datatype.DTM;
import ca.uhn.hl7v2.parser.ModelClassFactory;/*** @author luzihao* @date 2021/3/17 11:11 上午* @Description 自定义段,需继承 AbstractSegment*/
public class ZDS extends AbstractSegment {public ZDS(Group parent, ModelClassFactory factory) {super(parent, factory);//自定义初始化init();}private void init() {try {//1.数字,可以为空,不限制最大重复次数(0为不限制),长度50,名字是 room_numberadd(NM.class, false, 0, 50, new Object[]{getMessage()}, "room_number");//2.字符串,不可为空,最大重复次数为2,长度200,名字是 dept_nameadd(ST.class, true, 2, 200, new Object[]{getMessage()}, "dept_name");//3.日期,名字是 into_timeadd(DTM.class, true, 1, 200, new Object[]{getMessage()}, "into_time");} catch (HL7Exception e) {e.printStackTrace();}}/*** 此方法必须被覆盖。最简单的方法就是返回null。(网上资料看到的)* @param field* @return*/@Overrideprotected Type createNewTypeWithoutReflection(int field) {return null;}/*** 获取病房号,第一个字段* @return*/public NM getRoomNumber() {//取第一个字段,和初始化的顺序一样,下面的就省略了return getTypedField(1, 0);}/*** 获取科室名称,第二个字段* @return*/public ST getDeptName() {return getTypedField(2, 0);}/*** 获取住院时间,第三个字段* @return*/public DTM getIntoTime() {return getTypedField(3, 0);}
}

3.Java中创建自定义消息

  • 重点:创建的位置com.example.HL7.v24.message;
    • 上面需要解析的HL7消息的版本是2.4对应这里的v24
    • 这里自定义的是消息Message,对应这里的message
package com.example.HL7.v24.message;import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractMessage;
import ca.uhn.hl7v2.model.v24.segment.MSH;
import ca.uhn.hl7v2.parser.DefaultModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import com.example.HL7.v24.segment.ZDS;/*** @author luzihao* @date 2021/3/17 11:05 上午* @Description 自定义HL7消息,自定义消息需继承 AbstractMessage*/
public class ZDY_RES extends AbstractMessage {public ZDY_RES() {this(new DefaultModelClassFactory());}public ZDY_RES(ModelClassFactory theFactory) {super(theFactory);//已定义初始化this.init();}private void init() {try {//1.MSH段,不可为空,不可重复,在第一位,下标0开始this.add(MSH.class, true, false, 0);//2.ZDS段,不可为空,不可重复,在第二位(这里设置的我们的自定义段)this.add(ZDS.class, true, false, 1);} catch (HL7Exception e) {e.printStackTrace();}}/*** 需要覆盖此方法,返回自定义HL7消息中的版本号* @return*/@Overridepublic String getVersion() {return "2.4";}public MSH getMSH() {return getTyped("MSH", MSH.class);}/*** 获取ZDS段* @return*/public ZDS getZDS() {/*** 俩参数* 1.自定义段名 ZDS* 2.自定义段类 ZDS.class*/return getTyped("ZDS", ZDS.class);}}

4.正式解析

package com.example;import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.v24.datatype.NM;
import ca.uhn.hl7v2.model.v24.datatype.ST;
import ca.uhn.hl7v2.model.v25.datatype.DTM;
import ca.uhn.hl7v2.parser.CustomModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import ca.uhn.hl7v2.parser.PipeParser;
import com.example.HL7.v24.message.ZDY_RES;
import com.example.HL7.v24.segment.ZDS;import java.text.SimpleDateFormat;public class App {public static void main(String[] args) throws HL7Exception {//要解析的自定义HL7消息String hl7 = "MSH|^~\\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL\r" +"ZDS|999|九九九|20210315184009.925+0800";//创建hapi上线文HapiContext context = new DefaultHapiContext();//获取解析器PipeParser parser = context.getPipeParser();//创建自定义类工厂,此处是重点,指向我们自定义消息的文件位置的外层(也就是版本号的上一层)ModelClassFactory factory = new CustomModelClassFactory("com.example.HL7");//将自定义工厂类设置到上下文中,以便hapi可以找到对应的自定义消息,并解析context.setModelClassFactory(factory);//解析ZDY_RES zdy_res = (ZDY_RES) parser.parse(hl7);ZDS zds = zdy_res.getZDS();NM roomNumber = zds.getRoomNumber();ST deptName = zds.getDeptName();DTM intoTime = zds.getIntoTime();System.out.println("病房号:" + roomNumber.getValue());System.out.println("科室:" + deptName.getValue());System.out.println("住院日期:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(intoTime.getValueAsDate()));}
}
  • 重点解析:

我们可以打断点看一下自定义类工厂factory,其中customModelClasses是一个键值对的集合,key是版本,value是包名(也就是自定义消息的目录地址),而我们要解析的HL7消息的版本是2.4,所以根据我们上面创建的自定义类工厂所设置的包地址com.example.HL7后天加上[v24],而要解析自定义消息就会去找这个包下的message里面的自定义消息,要解析自定义就会找这个包下的segment里面的自定义段,相信看到这里大家也就明白了Hapi解析自定义消息的过程;
image.png
包的目录结构
image.png
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee
创作不宜,请勿抄袭!


http://www.ngui.cc/el/5181814.html

相关文章

找XShell替代品,用Tabby

找XShell替代品&#xff1f;不满意FinalShell&#xff1f;我推荐这款开源工具&#x1f970; 现目前的的远程终端工具有很多&#xff0c;功能齐全好用的收费&#xff0c;免费的功能外观又不怎么满意。XShell收费而且感觉用起来也一般&#xff0c;putty免费但很不方便&#xff0c…

windows 中搭建Gogs局域git仓库

windows 中搭建Gogs局域git仓库 前言 SVN我所欲也&#xff0c;Git我所欲也~ 但是最后&#xff0c;我选择了Git&#xff0c;不为别的&#xff0c;只是好用。 Git好用&#xff0c;可是服务器搭建很麻烦&#xff0c;GitHub、GitLab、码云….. 后来我想起了我以前公司搭建的局…

关于autoprefixer 编译丢失样式 处理

/* autoprefixer: off */-webkit-box-orient: vertical; /* autoprefixer: on */ 参考&#xff1a; https://github.com/postcss/autoprefixer/issues/776

H5移动端 IOS输入法遮挡input解决思路

思路 input 输入框置于页面底部&#xff0c;用absolute绝对定位于父级底部&#xff0c;在被唤起输入框时&#xff0c;会被IOS输入法自带的toolbar遮挡住input。 So&#xff0c;我的思路就是&#xff1a;点击input框后&#xff0c;延时出现&#xff0c;等IOS输入法唤起后&#…

Chocolatey 安装与命令

Chocolatey是一款专为Windows系统开发的、基于NuGet的包管理器工具&#xff0c;类似于Node.js的npm&#xff0c;MacOS的brew&#xff0c;Ubuntu的apt-get&#xff0c;它简称为choco。Chocolatey的设计目标是成为一个去中心化的框架&#xff0c;便于开发者按需快速安装应用程序和…

关于Mock数据笔记

Mock格式&#xff1a; 基础语法 参考 mock.js 文档 {"string|1-10": "★","string2|3": "★★","number|1": 202,"number2|1-100.1-10": 1,"boolean|1": true,"regexp": /[a-z][A-Z][0-9]…

RAP2本地搭建

RAP2搭建笔记 前言环境要求服务端 delos 环境搭建构建项目环境配置配置文件启动项目 客户端 dolores 环境搭建构建项目环境配置启动项目 本人遇到的问题附录 前言 2018年由于前后端分离&#xff0c;接口协定&#xff0c;于是自己想整一个接口管理后台&#xff0c;寻觅了半天&a…

关于VUE2.0+PM2搭建

关于VUE2.0PM2搭建 安装VUE脚手架 $ npm install vue-cli -g //这个是将vue脚手架进行全局安装。 $ npm install vue/cli -g //vue-cli3脚手架&#xff0c;安装此脚手架会更改创建项目命令&#xff0c;也可通过桥接npm包来保持vue2的命令 初始化vue项目&#xff08;进入自己…

关于Node request 全局变量问题

简述 在使用node的时候&#xff0c;常常需要使用的request回调数据&#xff0c;但是在声明全局变量后&#xff0c;再在request赋值&#xff0c;往往在外层是获取不到里面已经赋值的参数&#xff0c;因为request它是异步调用数据&#xff0c;在你方法在执行的时候&#xff0c;r…

VUE 父子组件 (本文针对的是vue 2.x)

这里写自定义目录标题 VUE 父子组件 &#xff08;本文针对的是vue 2.x&#xff09; VUE 父子组件 &#xff08;本文针对的是vue 2.x&#xff09; 子组件的调用有两种方式&#xff0c;一个是全局注册&#xff0c;即在main.js中注册,另外一种就是在需用使用到的页面里在componen…