劉剛,吳翔虎,曲明成,陳超,郝晶晶
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
目前我國各級醫院普遍存在管理能力不足的問題,導致醫療糾紛不斷、醫療事故頻發,同時醫院內部的各系統之間以及各醫院之間的信息無法共享,嚴重降低了信息的可用性,使電子病歷的實際應有的效用無法進一步提升[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)消息類型的定義格式。
消息類型觸發事件:消息段 消息段 … 消息段
在消息類型和觸發事件之間省略“^”,用下面符號表示消息段的必選/可選性及可重復性:
[xxx]——表示xxx出現0或1次
{xxx}——表示xxx出現1或多次
保存消息類型定義規則的文本文件為msgRules.txt。
(2)消息段的定義格式。文件中每一行為每個消息段的組成字段,字段性質由對應列表示,列的格式為:
字段長度 字段類型 必選/可選 重復性 注釋
在消息段的組成字段末,另起一行以消息段名(如MSH)結束,空一行再開始下一消息段的定義。論文將消息段的定義規則保存在文本文件segRules.txt中。
在進行消息構建/解析時,首先讀入存儲消息類型定義規則和消息段定義規則的文本文件,生成消息定義規則鏈表,以用于消息構建/解析時的有效性驗證。論文設計了消息定義規則鏈表的“工”字型存儲結構,由3條主線構成:
第1條是消息類型定義規則鏈表,每個結點的數據域存儲消息事件類型,指針域包括組成該消息類型的數據項鏈表的指針和指向下一結點的指針,消息類型的數據項指文本文件中消息類型后跟的除冒號、空格以外的消息段名和標志符號“[”“]”“{”“}”“<”或“>”。
第2條是消息段定義規則鏈表,每個結點的數據域包括消息段名和字段個數,指針域包括組成該消息段的字段規則鏈表的指針和指向該鏈表中下一結點的指針,這兩條主線分別構成“工”字型的上下兩邊。
第3條主線是對應消息類型數據項鏈表中的結點,在數據域設置了整數型變量,用以表示數據項的類型,如果數據項是消息段名,則類型取值為0,在其指針域中保存其在消息段定義規則鏈表中的指針,如果數據項是標志符號 :“[”“]”“{”“}”“<”或“>”,則類型取值為相應的ASCII值,指針域賦值為0。當消息類型定義中的數據項是消息段名時,其指向消息段定義規則鏈表中相應結點的指針建立起了上下兩條鏈表:消息類型規則鏈表和消息段規則鏈表之間的聯系,構成一個從消息類型到組成消息段到組成字段性質的縱向消息定義規則鏈表。從而使第1、第2,兩條鏈表既相互獨立,又通過第3條主線相聯系,組成一個完整的消息定義規則鏈表。
為表達鏈表的數據結構,本文定義了5個基本數據類型:① 消息定義規則類(CHL7Rule),用于表示整個消息定義規則,存儲指向消息類型規則鏈表和消息段定義規則鏈表的指針,并且保存指向兩個通用消息段MSH和MSA的指針;② 字段規則類(CFldRule),用于定義消息段中字段的性質;③ 消息段規則類(CSegRule),表達消息段的定義規則;④ 消息數據項類(CMsgTerm),定義組成消息類型的數據項;⑤ 消息類型規則類(CMsgRule),用于表達每個消息類型的定義規則。應用定義的數據類型,建立的鏈表存儲結構如圖1所示。

圖 1 消息定義規則鏈表的存儲結構
讀取消息定義規則的文本文件,生成消息定義規則鏈表的具體算法如下:
第1步,讀取文件segRules.txt,生成消息段定義規則鏈表;
第2步,讀取文件msgRules.txt,生成消息類型定義規則鏈表;
第3步,逐個讀取并判斷消息組成項字符串中的字符,構造消息數據項鏈表。在該算法中,設置一個字符串變量,用于存儲消息段名;設置一個堆棧,保存其起始地址,用于校驗標識符號的匹配性;設置一個標志變量state,state=1表示上一個是字符,state=2表示上一個是半開標識符[{或<,state=3表示上一個是半閉標識符>}或〕,state=4表示上一個是空格,state初始值為1。
本文通過類庫的開發來封裝和表達消息定義規則和消息的數據結構并實現用于消息構建和解析的函數接口。在類庫中通過消息、消息段、重復字段、成分和子成分等基本數據類型及鏈表類模板的定義,實現消息的多級指針鏈表結構。
(1)消息類(CHL7Msg)。消息是消息段的有序集合。消息中包括消息段鏈表的指針,還包括指向消息定義規則鏈表的指針。在消息構建/解析時,可以根據消息定義規則鏈表,進行必要的有效性驗證。
類中主要數據結構的聲明如下:

(2)消息段類(CHL7Seg)。消息段是字段的有序集合,其數據成員包括在消息段鏈表中指向下一節點的指針、消息段名、指向相應消息段規則的指針及字段的指針數組。一個字段又定義為重復字段的鏈表,該鏈表的指針即字段指針,在類的實現中,根據消息段定義規則中所包含的字段個數,動態分配字段指針數組的大小。
類中數據結構的聲明如下:

如果字段省略,則相應字段指針數組元素賦值為空。
(3)重復字段類(CHL7Rep)。其數據成員包括在重復字段鏈表中指向下一結點的指針及該重復字段的序號,對省略字段,不構造相應的數據對象,因此該序號標識的不是其在鏈表中的序號,而是其在當前字段中的順序位置。重復字段是成分的有序集合,其數據成員還包括指向成分鏈表的指針。
類中數據結構的聲明如下:


(4)成分類(CHL7Cmp)。其數據成員包括在成分鏈表中指向下一結點的指針及該成分的序號。對省略的成分不插入鏈表,其位置序號表示該成分在當前重復字段中的順序位置。成分是子成分的有序集合,其數據成員還包括指向子成分鏈表的指針。
類中數據結構的聲明如下:

(5)子成分類(CHL7SubCmp)。其數據成員包括在子成分鏈表中指向下一結點的指針及子成分序號。省略的子成分不插入鏈表,其序號標識該子成分在當前成分中的順序位置。子成分是消息分解的最小數據單元,在其數據成員中還包括CString類型的變量,將數據以字符串的形式保存在該層。
類中數據結構的聲明如下:

以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所示。
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個消息段、遍歷下一個消息段、查找最后一個消息段,按指定的消息段名查找消息段,在當前消息段中按指定的序號查找字段、重復字段、成分和子成分等。
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文檔對象
//依次獲得各層次元素屬性,并輸出}
下面根據上文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所示相對應的就診信息。
本文結合科技項目《基于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