java dom4j 去除空行_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;

}

///

/// 通過|分隔 字段

///

///

///

private static String[] GetMessgeFields(String s)

{

return s.split("\\|");

}

///

/// 通過^分隔 組字段

///

///

///

private static String[] GetComponents(String s)

{

return s.split("\\^");

}

///

/// 通過&分隔 子分組組字段

///

///

///

private static String[] GetSubComponents(String s)

{

return s.split("&");

}

///

/// 通過~分隔 重複

///

///

///

private static String[] GetRepetitions(String s)

{

return s.split("~");

}

///

/// 創建XML對象

///

///

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值