zoukankan      html  css  js  c++  java
  • HL7 2.X解析(JAVA版)

    https://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;

    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(" ");


    //去掉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 QRD|||||||||0001^郭靖^体检号^EQ^AND~0002^东一区^病区号^EQ^AND QRF||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))
    ————————————————
    版权声明:本文为CSDN博主「yanick」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ycyangcai/article/details/6643784

  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/zhoading/p/12124206.html
Copyright © 2011-2022 走看看