APP下载

HL7在HIS系统中的应用研究

2011-10-09刘刚吴翔虎曲明成陈超郝晶晶

中国医疗设备 2011年2期
关键词:链表字符串字段

刘刚,吴翔虎,曲明成,陈超,郝晶晶

1.哈尔滨医科大学第一临床医学院医学工程部,黑龙江 哈尔滨150001;2.哈尔滨工业大学 计算机科学与技术学院,黑龙江 哈尔滨150001

HL7在HIS系统中的应用研究

刘刚1,吴翔虎2,曲明成2,陈超2,郝晶晶2

1.哈尔滨医科大学第一临床医学院医学工程部,黑龙江 哈尔滨150001;2.哈尔滨工业大学 计算机科学与技术学院,黑龙江 哈尔滨150001

医院信息系统(HIS)间的“异构”问题由来己久,而业务的发展要求实现医疗信息的交换和共享。本课题引入了HL7标准作为医院信息系统间共同遵循的数据交换协议,以实现异构系统间数据的交换。文章以HL7消息作为主要研究对象,设计一个HL7消息的构建、解析演示系统。中间件包括两个功能模块:HL7消息的构建/解析模块和消息传输模块。消息的格式基于XML技术。系统的演示表明,在对现有系统不作更改的前提之下,采用外挂中间件的模式,能在系统间正常地处理传输基于XML格式的HL7消息,很好地解决了异构系统间数据的交换,符合当前的需要。本课题所作的探讨也为将来深入的研究工作提供了帮助。

HL7;中间件;构建/解析;XML

0 前言

目前我国各级医院普遍存在管理能力不足的问题,导致医疗纠纷不断、医疗事故频发,同时医院内部的各系统之间以及各医院之间的信息无法共享,严重降低了信息的可用性,使电子病历的实际应有的效用无法进一步提升[1-2]。提高医疗质量、保障医疗安全,应推进医院管理的科学化、规范化和标准化建设,这些需求变得越来越迫切[3]。随着医院的现代化程度逐渐提高,计算机、通信等信息技术在医学中的应用,医疗卫生事业进入了崭新的信息时代[4]。部分大型医院的信息系统由单独的挂号、划价、临床系统发展成为具有较大规模的HIS、PACS、RIS、LIS,以及医疗保险等多系统的复杂网络环境。各个系统之间通过统一的标准进行信息交换与共享的需求也变得越来越迫切[5-7]。因此,各个医院和地区之间的信息共享平台的建设、异构数据源的连接互通等信息共享技术的应用等研究也提到日程上来,有着很大的研究、应用和推广价值。

近年来,随着HL7标准越来越广泛地被接受和应用,HL7标准必将成为未来医疗信息系统间信息共享的主要参考标准[8-9]。因此对基于HL7的医疗信息系统的研究具有十分重要的意义。通过研究,不仅可以了解HL7的核心开发技术[10-12],学习和借鉴先进的现代医疗信息管理理论,从而缩短我国在该项技术上与发达国家的差距,保护我国相关行业的经济利益,还可以加快我国医疗信息系统的标准化步伐,实现与国际医疗信息的接轨[13-16]。

本课题结合项目的研究工作,在基于RFID的多维医疗信息实时综合管理系统的总体设计思想和框架下,主要研究基于HL7标准和XML技术的本土化消息处理中间件部分。研究的主要内容有:HL7标准,包括HL7各种事件的消息组成结构,以及消息中的各消息段构成;以标准化的XML格式对各种HL7消息进行表述。构建消息构造和解析的消息中间件,可以使医院内部各系统之间在短时间内可以通过标准的HL7消息进行互联,并使院际之间可以进行电子病例共享、多方会诊、远程诊断。完成课题,可以为《基于RFID的多维医疗信息实时综合管理系统研究》项目中医疗信息共享以及远程医疗研究的全面开展奠定基础。

1 HL7消息相关定义

1.1 消息定义规则的数据结构

1.1.1 消息定义规则文件的建立

本文采用两个文本文件分别存储消息类型定义规则和消息段的定义规则。文件具体格式如下:

(1)消息类型的定义格式。

消息类型触发事件:消息段 消息段 … 消息段

在消息类型和触发事件之间省略“^”,用下面符号表示消息段的必选/可选性及可重复性:

[xxx]——表示xxx出现0或1次

{xxx}——表示xxx出现1或多次

——表示xxx出现0或多次,<>代表标准中的{[]}和[{}]。

保存消息类型定义规则的文本文件为msgRules.txt。

(2)消息段的定义格式。文件中每一行为每个消息段的组成字段,字段性质由对应列表示,列的格式为:

字段长度 字段类型 必选/可选 重复性 注释

在消息段的组成字段末,另起一行以消息段名(如MSH)结束,空一行再开始下一消息段的定义。论文将消息段的定义规则保存在文本文件segRules.txt中。

1.1.2 消息定义规则链表的数据结构

在进行消息构建/解析时,首先读入存储消息类型定义规则和消息段定义规则的文本文件,生成消息定义规则链表,以用于消息构建/解析时的有效性验证。论文设计了消息定义规则链表的“工”字型存储结构,由3条主线构成:

第1条是消息类型定义规则链表,每个结点的数据域存储消息事件类型,指针域包括组成该消息类型的数据项链表的指针和指向下一结点的指针,消息类型的数据项指文本文件中消息类型后跟的除冒号、空格以外的消息段名和标志符号“[”“]”“{”“}”“<”或“>”。

第2条是消息段定义规则链表,每个结点的数据域包括消息段名和字段个数,指针域包括组成该消息段的字段规则链表的指针和指向该链表中下一结点的指针,这两条主线分别构成“工”字型的上下两边。

第3条主线是对应消息类型数据项链表中的结点,在数据域设置了整数型变量,用以表示数据项的类型,如果数据项是消息段名,则类型取值为0,在其指针域中保存其在消息段定义规则链表中的指针,如果数据项是标志符号 :“[”“]”“{”“}”“<”或“>”,则类型取值为相应的ASCII值,指针域赋值为0。当消息类型定义中的数据项是消息段名时,其指向消息段定义规则链表中相应结点的指针建立起了上下两条链表:消息类型规则链表和消息段规则链表之间的联系,构成一个从消息类型到组成消息段到组成字段性质的纵向消息定义规则链表。从而使第1、第2,两条链表既相互独立,又通过第3条主线相联系,组成一个完整的消息定义规则链表。

为表达链表的数据结构,本文定义了5个基本数据类型:① 消息定义规则类(CHL7Rule),用于表示整个消息定义规则,存储指向消息类型规则链表和消息段定义规则链表的指针,并且保存指向两个通用消息段MSH和MSA的指针;② 字段规则类(CFldRule),用于定义消息段中字段的性质;③ 消息段规则类(CSegRule),表达消息段的定义规则;④ 消息数据项类(CMsgTerm),定义组成消息类型的数据项;⑤ 消息类型规则类(CMsgRule),用于表达每个消息类型的定义规则。应用定义的数据类型,建立的链表存储结构如图1所示。

图 1 消息定义规则链表的存储结构

1.1.3 消息定义规则链表的实现算法

读取消息定义规则的文本文件,生成消息定义规则链表的具体算法如下:

第1步,读取文件segRules.txt,生成消息段定义规则链表;

第2步,读取文件msgRules.txt,生成消息类型定义规则链表;

第3步,逐个读取并判断消息组成项字符串中的字符,构造消息数据项链表。在该算法中,设置一个字符串变量,用于存储消息段名;设置一个堆栈,保存其起始地址,用于校验标识符号的匹配性;设置一个标志变量state,state=1表示上一个是字符,state=2表示上一个是半开标识符[{或<,state=3表示上一个是半闭标识符>}或〕,state=4表示上一个是空格,state初始值为1。

1.2 消息的抽象数据结构

本文通过类库的开发来封装和表达消息定义规则和消息的数据结构并实现用于消息构建和解析的函数接口。在类库中通过消息、消息段、重复字段、成分和子成分等基本数据类型及链表类模板的定义,实现消息的多级指针链表结构。

(1)消息类(CHL7Msg)。消息是消息段的有序集合。消息中包括消息段链表的指针,还包括指向消息定义规则链表的指针。在消息构建/解析时,可以根据消息定义规则链表,进行必要的有效性验证。

类中主要数据结构的声明如下:

(2)消息段类(CHL7Seg)。消息段是字段的有序集合,其数据成员包括在消息段链表中指向下一节点的指针、消息段名、指向相应消息段规则的指针及字段的指针数组。一个字段又定义为重复字段的链表,该链表的指针即字段指针,在类的实现中,根据消息段定义规则中所包含的字段个数,动态分配字段指针数组的大小。

类中数据结构的声明如下:

如果字段省略,则相应字段指针数组元素赋值为空。

(3)重复字段类(CHL7Rep)。其数据成员包括在重复字段链表中指向下一结点的指针及该重复字段的序号,对省略字段,不构造相应的数据对象,因此该序号标识的不是其在链表中的序号,而是其在当前字段中的顺序位置。重复字段是成分的有序集合,其数据成员还包括指向成分链表的指针。

类中数据结构的声明如下:

(4)成分类(CHL7Cmp)。其数据成员包括在成分链表中指向下一结点的指针及该成分的序号。对省略的成分不插入链表,其位置序号表示该成分在当前重复字段中的顺序位置。成分是子成分的有序集合,其数据成员还包括指向子成分链表的指针。

类中数据结构的声明如下:

(5)子成分类(CHL7SubCmp)。其数据成员包括在子成分链表中指向下一结点的指针及子成分序号。省略的子成分不插入链表,其序号标识该子成分在当前成分中的顺序位置。子成分是消息分解的最小数据单元,在其数据成员中还包括CString类型的变量,将数据以字符串的形式保存在该层。

类中数据结构的声明如下:

2 HL7消息的构建算法

以1.2节提出的消息的抽象数据结构为存储格式,本文在系统开发中设计了HL7消息构建的算法,其基本思想是:按消息→消息段→字段→成分→子成分的逻辑关系输入并保存界面应用程序数据,构造消息的多级指针链表数据结构;遍历消息类型定义规则链表,按消息段的定义顺序、必选/可选性和可重复性顺序读取并校验消息对象的数据结构;根据数据在链表中的层次信息,添加相应的消息分隔符,以字符串形式输出符合标准格式的HL7消息[14]。

具体实现流程如下:

第1步,创建消息对象,按消息构成的逻辑关系,输入界面应用程序数据,建立消息的多级指针链表数据结构。具体实现步骤如下:

(1)构造消息段链表对象,将指针保存在消息对象中。

(2)按照标准定义的顺序插入一个消息段对象。输入消息段名,遍历并查找消息定义规则链表中相应的消息段定义规则,将其指针作为初始值,构造消息段对象,向后插入消息段链表,并将该对象设为当前结点。

(3)在当前消息段中,依次输入字段字符串及字段序号,通过查找字符串中的消息分隔符,将字符串分解为重复字段、成分和子成分,逐层建立其相关链表结构。下面以图2中字段PM&BN^OU~WA^GH为例,说明字段中数据元素属性的分解和链表的建立过程。

图 2 字段中重复字段的查找

(4)在插入上,也可以依序插入成分或插入子成分或混合插入。以插入成分为例,输入成分字符串和字段序号nFldNum,判断当前消息段对象中的字段指针数组元素pFldArray[nFldNum-1]是否为0,如果为0,从创建重复字段链表开始建立包含消息字符串的链表结构;否则,创建一个成分对象的链表结构,向后插入重复字段链表尾结点的成分链表中(如图3所示)。其实现原理同步骤(3)。

图 3 构造重复字段链表流程图

(5)重复步骤(2),构造消息段链表。

第2步,查找消息定义规则链表,找到与消息类型代码相同的消息类型定义规则结点,同步遍历消息类型的组成项链表和第1步中已生成的消息段链表。对应消息类型定义规则,在消息构建的同时检验消息段的定义顺序、必选/可选性和可重复性是否和标准定义一致。

第3步,将消息对象的链表结构中存储的数据信息转化为符合HL7标准格式的消息,输出至字符串变量。指针数组遍历流程图如图4所示;重复字段链表遍历的流程图如图5所示;成分链表遍历的流程图如图6所示;子成分链表遍历的流程图如图7所示。

图 4 消息字段指针数组遍历流程图

图 5 重复字段链表遍历流程图

图 6 成分链表遍历流程图

图 7 子成分链表遍历流程图

HL7消息构建过程中链表的访问关系是:遍历一个消息对象中的消息段链表,对每个消息段对象,顺序访问其字段指针数组元素,对每个字段,遍历其重复字段链表,对每个重复字段嵌套对其成分链表的遍历,对每个成分又嵌套对其子成分链表的遍历,直至将数据和消息分隔符按其层次关系逐级插入消息字符串变量中,其嵌套关系如图8所示。

3 HL7消息的解析算法

HL7消息解析是将标准格式的消息转换为应用程序数据。本文提出的消息解析算法的基本思想是:首先解析消息字符串,以消息分隔符为标志,界定出消息中的消息段、字段、成分和子成分,构造消息的多级指针链表数据结构;然后通过对数据结构中链表的遍历,查找任一数据元素[15]。

其具体实现方法可分为两步:

第1步,读入消息字符串,将数据按其层次及位置信息存入消息的多级指针链表数据结构中,字符串的解析算法如下:

(1)首先解析MSH消息段。按2节中第3步算法,以消息分隔符为标志,将MSH消息段中的字符串分解至最小属性——子成分属性,构造消息段对象的数据结构,并将该结点作为头结点插入消息段链表中。MSH消息段在每个消息中都作为第1个消息段出现,在字符串解析的过程中从该消息段中读取消息类型代码,用于对其后消息段解析过程中,对应消息定义规则链表中相应的消息类型,进行必要的有效性验证。

(2)根据上步读取的消息类型代码,在消息定义规则链表中查找相应的消息类型定义规则,按第2节消息构建算法第2步中提出的消息类型组成项链表的同步遍历和有效性验证算法,顺序读取并校验消息字符串中的消息段,按第3步的算法构造消息对象的链表数据结构。

(3)在消息字符串的解析中,可设两个指针,通过两个指针的顺序移动,界定出不同的数据元素。每处理一个消息段,首先判断消息段的前3个字母是否是消息类型定义规则中相应的消息段;如果是,则第1个指针指向该消息段的第1个字段处,另一个指针则查找并指向该指针所指字符串中的第1个字段分隔符或回车分隔符,界定出消息段中的一个字段;然后按第2节中消息构建算法第1步(3)中提出的字段中数据元素属性的分解和链表的建立算法,将数据按其层次信息,保存在链表中,并将重复字段链表的指针赋值给消息段中相应的字段指针数组元素。两个指针交替向前移动,直至一个指针指向回车分隔符且读入的消息段数量与消息段定义规则中定义的字段数量相等时,完成一个消息段对象数据结构的建立;继续读取下一个消息段,建立消息段链表,至消息字符串结束。消息段链表的指针保存在消息对象中。

对消息字符串中的转义序列,当消息字符串分解至最小属性——子成分属性时,查找是否有转义字符“”存在。如果有,调用转义序列的解码函数,函数的参数包括输入字符串指针和输出字符串指针,通过两个指针的顺序移动,将输入字符串中的字符逐个拷入输出字符串,并判断是否是“”,如果是且其后的第二个字符也是“”,并且两个字符之间包含转义码“F”、“S”、“R”、“T”或“E”,则代之以相应的特殊字符拷入至输出字符串,其对应关系为:F→“|”;S→“^”;R→“~”;T→“&”;E→“”。

第2步,通过遍历消息对象的链表数据结构,查找任一指定的消息元素。如:查找第1个消息段、遍历下一个消息段、查找最后一个消息段,按指定的消息段名查找消息段,在当前消息段中按指定的序号查找字段、重复字段、成分和子成分等。

4 基于XML的HL7消息构建/解析

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便地遍历这棵XML树。本文通过此种方法构建/解析上文得到的HL7消息。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

在TinyXML中,根据XML的各种元素来定义了一些类:

图 8 HL7消息构建的嵌套关系

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类)TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。

本文在应用TinyXML解析HL7消息时,定义主要函数如下:

bool CreateXmlFile(string& szFileName)

//创建XML文件,szFilePath为文件保存的路径

{//创建XML文档对象

//依次创建各层次元素并连接

//设置各层次元素属性}

bool ReadXmlFile(string& szFileName)//读取XML文件,并遍历

{//创建XML文档对象

//依次获得各层次元素属性,并输出}

5 HL7中间件应用实例演示

下面根据上文HL7消息研究与分析,以哈尔滨医科大学附属第一医院和医保系统间的费用结算业务为实例演示基于XML格式的HL7消息的应用。

就诊信息:病人张童,女,1985年8月14日出生,就职单位是哈尔滨工业大学图书馆,就职情况是在职。2009年4月21日9:45该病人到哈医大一院就诊,至2009年4月21日13:20发生编号为00611的费用,费用情况为该病人使用了一瓶5%葡萄糖氯化钠针,金额为8.60元。

根据以上信息,界面信息填写完整,如图9所示。

图 9 填写就诊信息

所得信息,经过HL7中间件的构造,得到相对应的HL7标准消息界面显示,如图10所示。

图 10 相对应的HL7标准消息界面显示

得到相对应的HL7标准消息文档显示,如图11所示。

图 11 相对应的HL7标准消息文档显示

所得信息,经过HL7中间件的构造,得到相对应的XML格式的HL7消息,如图12所示。

图 12 相对应的XML格式的HL7消息

同理,如若给出如图10所示的HL7标准消息,或是如图11所示的XML格式的HL7消息,经过HL7中间件的解析,可以得到如图9所示相对应的就诊信息。

6 结束语

本文结合科技项目《基于RFID的多维医疗信息实时综合管理系统研究》,在系统的总体设计思想和框架下,对基于XML的HL7消息处理技术做了较为深入的研究。探讨不同医疗系统之间异构数据源环境下的数据共享与集成的实现技术,设计和实现了HL7消息中间件,其作用是实现医疗信息系统之间的信息共享。本文着重研究了HL7标准,包括HL7各种事件的消息组成结构,以及消息中的各消息段构成,并以标准化的XML格式对各种HL7消息进行表述。构建消息构造和解析的消息中间件,使医院内部各系统之间在短时间内可以通过标准的HL7消息进行互联,并使院际之间可以进行电子病例共享、多方会诊、远程诊断,为《基于RFID的多维医疗信息实时综合管理系统研究》项目中医疗信息共享以及远程医疗研究的全面开展奠定了基础。

[1]Beeler G W. HL7 Version3-An Object-oriented Methodology for Collaborative Standards Development[J].International Journal of Medical Informatics,1998,48:151-161.

[2]张文康.我国卫生信息化建设现状与展望[J].中国信息年鉴,2002,(9):16-21.

[3]刘丹红,张玉海,徐勇.医院信息标准化应遵循的几个原则与主要内容[J].中国医院统计,2002,9(2):2-3.

[4]闫华,何雨生.HL7版本3浅析[J].世界医疗器械,2003,(1): 7-9.

[5]Boqiang LIU,Xiaomei LI,Zhongguo LIU.Design and Implementation of Information Exchange between HIS and PACS Based on HL7 Standard[C]. Proceedings of the 5th International Conference on Information Technology and Application in Biomedicine, in conjunction with The 2nd International Symposium & Summer School on Biomedical and Health Engineering. ShenZhen, China:2008:552-553.

[6]靳强勇.异构数据集成技术的发展和现状[J].计算机工程与应用,2002,1(11):8-10.

[7]王连泽.异构数据源集成方法的设计与实现[D].天津:河北工业大学,2002.

[8]金霞.医疗信息交换中HL7消息的构建/解析和传输关键技术研究[D].大连:大连理工大学,2003.

[9]Robert H.Dolin, Liora Alschuler, Fred Behlen. HL7 Document Patient Record Architecture: An XML Document Architecture Based on a Shared Information Model[J].Proceedings,1999,(13):52-60.

[10]齐国隆,孔令人,邹宗峰.医院信息系统的HL7本地化改造[J].湖北预防医学杂志,2003,14(3):7-8.

[11]傅征,任连仲.医院信息系统建设与应用[M].北京:人民军医出版社,2002:26-28.

[12]陈智生,陈金雄,余轮.一种中间件的原理简介[J].中国医疗器械杂志,2006,30(4):5-8.

[13]陆波,李伟鹏,王琦.基于XML的HL7消息处理技术[J].医疗卫生装备,2005,26(12):3-4.

[14]W3C Extensible Markup Language(XML)1.0[EB/OL].(2008-11-26)[2010-11-22].http://www.w3.org/TR/xml/.

[15]王晔,等.基于HL7CDA的InfoPath电子病历系统设计[J].中国医疗设备,2009,24(8):66-69.

[16]高家海.基于XML的HL7消息的构建、解析及传输[D].广州:暨南大学,2007.

Application Research of HL7 in HIS

LIU Gang1, WU Xiang-hu2, QU Ming-cheng2, CHEN Chao2, HAO Jing-jing2
1. Medical Engineering Department,First Clinical Hospital of Harbin Medical University, Harbin Heilongjiang 150001,China; 2. Computer College of Harbin Institute of Technology, Harbin Heilongjiang 150001, China

TP393.04

C

10.3969/j.issn.1674-1633.2011.02.012

1674-1633(2011)02-0042-07

2010-07-23

2010-11-01

黑龙江省科技攻关项目(GC08A108)。

本文作者:刘刚,博士,研究员级高级工程师。

作者邮箱:liugang@54dr.com

Abstract:There is a long history about isomerous problem in HIS. With the development of medical business, medical information exchange and share are needed. The project introduces HL7 standard as a protocol for statistical exchange between both parties in the communication for the exchange of statistical information. This paper mainly studies the HL7 information based on the practical model of information exchange in The First Clinical College of Harbin Medical University and Medical Insurance Center, and designs a demo system so that it can construct and parse the message base on HL7 standard. The HL7's middleware consists of two function models: HL7 message construction model and HL7 message parse model. The format of HL7 message is based on XML. The system demonstrates that, without change the frame of current system, the HL7 middleware can construct, parse and transmission HL7 message based on XML. It fits for the statistical exchange between isomerous systems to achieve the present aim. Furthermore,the discussion in the project will help further research in the future.

Key words:HL7; middleware; construct/parse; XML

猜你喜欢

链表字符串字段
基于文本挖掘的语词典研究
如何用链表实现一元多项式相加
浅谈台湾原版中文图书的编目经验
跟麦咭学编程
基于MTF规则的非阻塞自组织链表
SQL server 2008中的常见的字符串处理函数
最简单的排序算法(续)
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究