上一篇文章博主笼统的讲了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|ALZDS|999|九九九|20210315184009.925+0800
解析过程
1.解读HL7消息(我只给大家解读下解析消息需要注意的重点,我会将重点标红)
- MSH段解读
- 这个自定义消息的名称是ZDY^RES(ZDY_RES)
- 使用版本 2.4
ZDS段解读
重点:创建的位置
com.example.HL7.v24.segment;- 上面需要解析的HL7消息的版本是2.4对应这里的v24;
- 这里自定义的是段Segment,对应这里的segment; ```java 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 */ @Override protected 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; ```java 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 */ @Override public 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); }
}
<a name="ISiXC"></a>## 4.正式解析```javapackage 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里面的自定义段
包的目录结构
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee)
创作不宜,请勿抄袭!
