1. 程式人生 > >HL7 2.X解析(JAVA版)

HL7 2.X解析(JAVA版)

   Hl7引擎的目標主要是解決將資料按HL7協議的要求標準化,和標準業務的整合和不同系統間標準業務資料的同步。在多年的醫院資訊化過程中,HL7標準組織和解析最複雜了,下面是我用了多年HL7引擎解析,主要有兩個版本1.C#,2.JAVA版的。

 本次公開JAVA的

引擎類:

package com.xxxx.hl7;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class HL7ToXmlConverter {
	
	public static String ConvertToXml(String sHL7)
    {
		Document document = ConvertToXmlObject(sHL7);  
		String hl7str = document.asXML();		
        return hl7str;
    }
	
	public static String ConvertToXml(Document document)
    {
		String hl7str = document.asXML();		
        return hl7str;
    }
	
	
	public static Document ConvertToXmlObject(String sHL7)
    {
		 Document document = CreateXmlDoc();
	       
		//把HL7分成段
         String[] sHL7Lines = sHL7.split("\n");


         //去掉XML的關鍵字
         for (int i = 0; i < sHL7Lines.length; i++)
         {
             sHL7Lines[i] = sHL7Lines[i].replace("^~\\&", "").replace("MSH", "MSH|");
         }
		 
         for (int i = 0; i < sHL7Lines.length; i++)
         {
             // 判斷是否空行
             if (sHL7Lines[i] != null)
             {
            	 String sHL7Line = sHL7Lines[i];

                 //通過/r 或/n 回車符分隔
                 String[] sFields = GetMessgeFields(sHL7Line);
                 
              // 為段(一行)建立第一級節點                 
                 Element el = document.getRootElement().addElement(sFields[0]);
                 
              // 迴圈每一行
                 Boolean isMsh=true;
                 for (int a = 1; a < sFields.length; a++)
                 {
                	 
                	
                	 
                	//是否包括HL7的連線符^~\\&
                     if (sFields[a].indexOf('^')>0 || sFields[a].indexOf('~')>0 || sFields[a].indexOf('\\')>0 || sFields[a].indexOf('&')>0 )
                     {//0:如果這一行有任一分隔符
                    	 
                    	 //開始操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    	 
                    	 //通過~分隔
                         String[] sComponents = GetRepetitions(sFields[a]);
                         if (sComponents.length > 1)
                         {//1:如果可以分隔 0001^郭靖^體檢號^EQ^AND~0002^東一區^病區號^EQ^AND
                        	 
                        	 for (int b = 0; b < sComponents.length; b++)
                             {
                        		// Element fieldEl1 = el.addElement(sFields[0] + "." + a);
                        		 CreateComponents(el,sComponents[b],sFields[0],a,b);   
                             }
                        	 
                        	 
                         }
                         else
                         {//1:如果真的只有一個值的 0001^郭靖^體檢號^EQ^AND
                        	// 為欄位建立第二級節點
                        	// Element fieldEl = el.addElement(sFields[0] + "." + a);
                        	 CreateComponents(el,sFields[a],sFields[0],a,0);
                        	 
                        	 
                        	 
                        	 //fieldEl.setText(sFields[a]+"11111111111111");
                         }
                    	 
                    	 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                     }
                     
                     else
                     {//0:如果這一行沒有任何分隔符
                    	// 為欄位建立第二級節點
                    	Element fieldEl = el.addElement(sFields[0] + "." + a);
                        fieldEl.setText(sFields[a]);
                    	 
                    	 
                     }
                	 
                 }
                 
                 
             }//end if
             
         }//end for 
		
         
       //修改MSH.1 和 MSH.2的值
       document.selectSingleNode("HL7Message/MSH/MSH.1").setText("|");
       document.selectSingleNode("HL7Message/MSH/MSH.2").setText("~^\\&");
       //  document.selectNodes("MSH/MSH.1");
         
         
	    return document;
    }
	
	
	@SuppressWarnings("unused")
	private static Element CreateComponents(final Element el,final String hl7Components,String sField,int a,int b)
	{	
		 	Element componentEl = el.addElement(sField + "." + a);
    		// Element componentEl =el;//.addElement(sField + "." + a + "." + b);
    		 
    		 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    		//通過&分隔 
             String[] subComponents = GetSubComponents(hl7Components);
             if (subComponents.length > 1)
             {//2.如果有字組,一般是沒有的。。。  子分組 用&很少用
            	 
             }
             else
             {//2.如果沒有了,就用^分組
            	   String[] sRepetitions = GetComponents(hl7Components);
                   if (sRepetitions.length > 1)
                   {
                       Element repetitionEl = null;
                       for (int c = 0; c < sRepetitions.length; c++)
                       {
                           repetitionEl = componentEl.addElement(sField + "." + a + "." + (c+1));
                           repetitionEl.setText(sRepetitions[c]);
                       }
                   }
                   else
                   {
                       componentEl.setText(hl7Components);
                   }
            	 
            	 
             }
             //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    	
		return el;
		
	}
	
	
	
	  /// <summary>
    /// 通過|分隔 欄位
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private static String[] GetMessgeFields(String s)
    {
        return s.split("\\|");
    }

    /// <summary>
    /// 通過^分隔 組欄位
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private static String[] GetComponents(String s)
    {
        return s.split("\\^");
    }

    /// <summary>
    /// 通過&分隔 子分組組欄位
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private static String[] GetSubComponents(String s)
    {
        return s.split("&");
    }

    /// <summary>
    /// 通過~分隔 重複
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private static String[] GetRepetitions(String s)
    {
        return s.split("~");
    }

    /// <summary>
    /// 建立XML物件
    /// </summary>
    /// <returns></returns>
    private static Document CreateXmlDoc()
    {
    	Document output = DocumentHelper.createDocument();   
    	//生成一個接點   
        Element rootNode = output.addElement("HL7Message");   
        return output;
    }
	
	
	
    public static String GetText(Document document, String path)
    {
    	Node node = document.selectSingleNode("HL7Message/"+path);      
        if (node != null)
        {
            return node.getText();
        }
        else
        {
            return null;
        }
    }
    public static String GetText(Document document, String path,int index)
    {
    	List nodes = document.selectNodes("HL7Message/"+path);  
        if(nodes!=null)
        {
        	return ((Node)nodes.get(index)).getText();
        }
        else
        {
        	return null;
        }

    }
    
    public static List GetTexts(Document document, String path)
    {  
        List nodes = document.selectNodes("HL7Message/"+path);  
        return nodes;
        

    }


	
	
	
	
	
	
	
	
	
	 public static void writeDocument(Document document, String filepath){   
	        try{   
	            //讀取檔案   
	          //  FileWriter fileWriter = new FileWriter(filepath);   
	            Writer writer = new OutputStreamWriter(new FileOutputStream(filepath),"utf-8");

	            //設定檔案編碼   
	            OutputFormat xmlFormat = new OutputFormat();   
	            xmlFormat.setEncoding("utf-8");   
	            //建立寫檔案方法   
	            XMLWriter xmlWriter = new XMLWriter(writer,xmlFormat);   
	            //寫入檔案   
	            xmlWriter.write(document);   
	            //關閉   
	            xmlWriter.close();   
	        }catch(IOException e){   
	            System.out.println("檔案沒有找到");   
	            e.printStackTrace();   
	        }   
	    }   


}

單元測試呼叫類:

 String  myHL7string="MSH|^~\\&|455755610_0100||0200||20110624160404|000|QRY^A19^QRY_A19|0123456001|P|2.6\nQRD|||||||||0001^郭靖^體檢號^EQ^AND~0002^東一區^病區號^EQ^AND\nQRF||20110627|20110803";
		  Document document = HL7ToXmlConverter.ConvertToXmlObject(myHL7string);
		  
		  //獲取事件
		  String eventName = HL7ToXmlConverter.GetText(document, "MSH/MSH.9/MSH.9.3");
		  System.out.println("eventName:"+eventName);
		  
		  
		 //  List nodeValue = document.selectNodes("MSH.1");
		  String nodeValue = document.selectSingleNode("HL7Message/MSH/MSH.1").getText();
          String nodeValue2 = document.selectSingleNode("HL7Message/MSH/MSH.3").getText();      
		 // DocumentElement.SelectNodes(path);
          System.out.println(nodeValue+":"+nodeValue2);
          
          
          String value = HL7ToXmlConverter.GetText(document, "QRD/QRD.9/QRD.9.1",0);
          String value1 = HL7ToXmlConverter.GetText(document, "QRD/QRD.9/QRD.9.1",1);
          String value2 = HL7ToXmlConverter.GetText(document, "QRD/QRD.9/QRD.9.1");
          System.out.println(value+":"+value1+":"+value2);
		  
          List<Node> list = HL7ToXmlConverter.GetTexts(document, "QRD/QRD.9/QRD.9.1");
          for(Node node : list)
          {
        	  System.out.println(":"+node.getText());
          }
          
          
          System.out.println(HL7ToXmlConverter.ConvertToXml(myHL7string));

相關推薦

HL7 2.X解析(JAVA)

   Hl7引擎的目標主要是解決將資料按HL7協議的要求標準化,和標準業務的整合和不同系統間標準業務資料的同步。在多年的醫院資訊化過程中,HL7標準組織和解析最複雜了,下面是我用了多年HL7引擎解析,主要有兩個版本1.C#,2.JAVA版的。 本次公開JAVA的引擎類:pac

Jersey 2.x 分支 Java SE 相容性

直到 Jersey 2.6 版本,Jersey 將會相容 Java SE 6。這個情況將會在在 Jersey 2.7 的版本有所改變。 直到 Jersey 版本 2.25x, 所有的 Jersey 的元件將會相容 Java SE 7 為目標。這個意思是你將會需要最少使用 Java

聯通SGIP1.2簡訊介面 Java實現 總結 2013-10-23測試通過

我的開發過程: 1:根據聯通提供的SGIP介面文件,封裝裝協議。 2:編寫通訊流程 3:經理建議由原來的socket換成nio socket 4: 經理建議由原來的把Jar整合到需要呼叫的應用中變為 獨立一個簡訊應用並用hessian對外發布。別的應用可以訪問此介面進行呼叫

sed命令n,N,d,D,p,P,h,H,g,G,x解析2

sim ini 字母 tail san ati hidden 不執行 href 摘自: https://blog.csdn.net/xiexingshishu/article/details/50514132sed命令n,N,d,D,p,P,h,H,g,G,x解析2016

Protocol Buffer 之 Java 使用(基於Spring Boot 2.x

開發環境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8 1.在專案的pom.xml檔案下,引入protobuf的Jar開發包依賴;並且可以配置protobuf 的Maven外掛,對編寫的proto檔案編譯成Java檔案。

Java HttpClient4.2.x版本get、post請求工具類

ont char cat time exec con lai pla names 公司業務需要,跟很多公司合作,經常需要請求外部http接口,而項目架構是一個比較老的框架整合,僅http請求的工具類就很多個,顯得雜亂無章; 有些接口測試時,對方做了IP白名單限制的,ZIP壓

maven maven-war-plugin 解決java war專案間的依賴(兩個war都可獨立部署執行,maven 3.2.x親測)

最近整理基礎框架,有些專案不想分散式,所以基礎框架必須同時可獨立部署,也可直接被作為依賴和業務工程打到一起,記錄下解決war專案依賴的要點,一開始用warpath,結果報找不到,有些帖子還是17年的,於是繼續檢視。 warpath 是個坑,按照網上的說明基本跑不通,可能是maven-war-plugin 升

AKKA官方文件閱讀筆記(1)JAVA2.5.16

準備工作: Actor層級結構 其實在你用程式碼建立Actor之前,Akka自己就已經建立三個actor了,它們都是負責監管自己下面的actor的: / 這個就是傳說中的跟監管者,是所有actor的祖先,當系統終止時,它一定是最後一個被停止的 /user

JAVACORBA程式2——Counter

問題描述: 要求: 編寫實現連加、連減和加減混合等數學++/- -運算,並進行測試。 實現詳解: 1 編寫IDL介面counter.idl: module CounterApp{       interface Counter{           read

微信支付 XML解析工具類 JAVA

package utils; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEn

X.509證書的讀取操作與分析(Java

文章目錄 X.509證書的讀取操作與分析 1. X.509 1.1 定義 1.2 組成結構 1.3 安全性 1.4 證書檔名擴充套件型別 2. 讀取操作程式 2.1

RxJava 2.x 教程及原始碼揭祕(三)Rxjava操作符原始碼解析

本文將探究: 知道執行緒排程是怎麼實現的 知道操作符是怎麼實現的 RxJava最強大的莫過於它的執行緒排程 和 花式操作符。 map操作符 map是一個高頻的操作符,我們首先拿他開刀。 例子如下,源頭Observable傳送的是String型別的數字,利用map轉換成

b樹的實現(2)---java程式碼

原文地址: http://blog.csdn.net/cdnight/article/details/10619599 [java] view plain copy print? 感覺上,b樹的插入及刪除操作都不如RB樹複雜。當年插紅黑樹的各種操作解釋文章都

【演算法】B+樹的研讀及實現(2)---java核心程式碼

【前言】 假如大家已經弄懂了b樹及b+樹那麼恭喜你們了,因為我覺得,b樹及b+樹是檔案系統尤其是資料庫優化的關鍵。 這裡預告一下,下一篇課題(也不能說課題,只能用“業餘研究題目”這種稱呼)是R樹,R樹似乎是多維的B+樹,各位假如也希望弄懂R樹的話,請先好好看看b+樹。

AWS SDK for Java 2.x released

We’re pleased to announce that the AWS SDK for Java 2.x is now generally available and supported for production use. Version 2.x is a majo

淺析RxJava 1.x&2.x版本使用區別及原理(一):Observable、Flowable等基本元素原始碼解析

RxJava開源框架的風靡程度在Github上無需多言,它帶來的響應式程式設計模式和執行緒隨意切換、巢狀請求、背壓等功能給了開發者耳目一新的體驗,更是成為了大多數APP中常用的RxJava+Okhttp/Retrofit+MVP/MVVM/Clean黃金組合中的

Python(2.7.x)呼叫Java的簡單示例

1. 安裝Jython 在Linux中: sudo apt-get install jython 在Windows中: 在http://www.jython.org/下載相應版本的jython-installer-x.x.x.jar進行安裝。 設定環境變數: JYTHON

Java IDEA 2016.2.x 最新版啟用方法

2016年7月14日 phpstorm 推送2016.2 更新 2016年10月25日phpstorm 推送2016.2.2 更新 2016年11月24日phpstorm 推送2016.3 更新 下面啟用方法同樣適用. 破解檔案要升級成對應的2.6 1.license server 線上啟用方式

JAVA Cloud微服務項目實戰 SpringBoot 2.x +SpringCloud

場景 完成 boot 同步和異步 cloud 使用 基本 部署 fig 課程目錄第1章 課程介紹課程導學和學習建議1-1 SpringCloud導學1-2 獲取源碼說明1-3 提問建議1-4 點餐項目演示說明第2章 微服務介紹什麽是微服務, 單體架構優缺點, 常見的幾種架構

JAVA Cloud微服務專案實戰 SpringBoot 2.x +SpringCloud

課程目錄第1章 課程介紹課程導學和學習建議1-1 SpringCloud導學1-2 獲取原始碼說明1-3 提問建議1-4 點餐專案演示說明第2章 微服務介紹什麼是微服務, 單體架構優缺點, 常見的幾種架構模式。2-1 微服務和其他常見架構2-2 從一個極簡的微服務架構開始第3章 服務註冊與發現介紹微服務中的服