原文链接 http://blog.csdn.net/ycyangcai/article/details/6643784

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;
//HL7 转换为XML
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 java 解析的更多相关文章

  1. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

  2. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  3. java 解析XML文档

    Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...

  4. Java 解析 XML

    Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...

  5. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  6. JSON 之JAVA 解析

    一.   JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. Json建构于两种结构:     1.“名称/值”对的集合(A collection ...

  7. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  8. Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包

    秀才坤坤出品 一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包 ...

  9. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

随机推荐

  1. 使用 Oracle Sql plus的一点经验

    1    当你输入的语句有错误的时候,不用重新输入语句,直接输入ed就会出现一个文本文档显示之前输入的语句,这样你可以在文本文档里面修改语句,最后点保存. 2 三个set:设置每行显示的记录长度:SE ...

  2. C#修改 Excel指定单元格的值

    /// <summary> /// 将指定字符串写入指定单元格中 /// </summary> /// <param name="data">要 ...

  3. 端口扫描器之java实现

    端口扫描器之java实现   import java.net.*;import java.io.*;import java.awt.*;import java.awt.event.*;import j ...

  4. Lazarus中TreeView导出XML以及XML导入TreeView

    本来说是要给自己的某程序加一个xml导出功能,但是自己也没接触过xml,加之delphi和lazarus的xml部分还都不一样,折腾好久(整一天)才解决问题.. 如下是作为导出功能的组件部分: uni ...

  5. 关于css3的背景切割(background-clip)、背景原点(background-origin)的使用

    一.背景切割   background-clip :border-box | padding-box | content-box   作用:为将背景图片做适当的裁剪,以适应需要.   默认格式 bac ...

  6. Android Permissions管理之用户拒绝授权

    Android Permissions管理之用户拒绝授权,在Marshmallow之前的安卓版本,应用的权限只需要注册一下,应用就会获取到,在Marshmallow之后,为了安全,全新的权限模型出现, ...

  7. ubuntu下lnmp的安装

    适用于ubuntu14.04和源是14.04的ubuntu上安装nginx(我学在线Moodle工作室---注这里安装的是最新版的nginx,并且解决pathinfo问题,特别适用于Moodle安装) ...

  8. Python学习路径和个人增值(整合版)

    PS:内容来源于网络 一.简介         Python是一种面向对象.直译式计算机程序设计语言,由Guido van Rossum于1989年底发明.由于他简单.易学.免费开源.可移植性.可扩展 ...

  9. MVC 返回ActionResult 类型

    1. Content() 返回文本类型,比如"Hello World!". 2.File() 返回文件类型,如PDF,JPG. 3.HttpNotFound() 返回404 HTT ...

  10. [Django] html 前端页面jQuery、图片等路径加载问题

    严格的说这个话题应该属于一个html前端路径加载问题.为了实现一个局部更新页面的功能,简单了解了一下Ajax.Ajax是一个为了实现浏览器和服务器异步通信功能的模块.严格来说不是一个新的语言,只是JS ...