hl7 java 解析
原文链接 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 解析的更多相关文章
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- java 解析XML文档
Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...
- Java 解析 XML
Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- JSON 之JAVA 解析
一. JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. Json建构于两种结构: 1.“名称/值”对的集合(A collection ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包
秀才坤坤出品 一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包 ...
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
随机推荐
- Oracle使用imp/exop远程导入导出dmp数据
在导入导出数据之前,习惯性的检查一下,看看我们自己的机器可不可以连接远程的Oracle主机,检测方法是tnsping SERVICE_NAME.我的机器如下: C:\Users\zx>tnspi ...
- HDU 4415 - Assassin’s Creed
Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...
- 设计模式之适配器模式(Decorator)
1.意图 动态地给一个对象添加一些额外的功能. 2.适用性 动态.透明的方式给单个对象添加职责. 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式. 避免子类数目爆炸性增长. 3.结构 4.参 ...
- Qt标题栏图标和运行程序图标设置
一.标题栏图标 1.*.qrc资源文件中添加图片 2.添加代码 setWindowIcon(QIcon(":/images/paste.png")); //设置窗口上的图标,需要在 ...
- bootstrap简章
系统整理一遍bootstrap 的东西 1/ 设置页面为H5文档类型 <!DOCTYPE html> <html lang="zh-CN"> ... &l ...
- PHP5的类与对象
类是一个由变量和方法组成的独立程序块或功能模块. 人类: 口,脚,身高,体重,姓名,肤色等 (变量) 说话,行走等(方法) 丁三石,马化树,张夕阳(具体对象) 类的定义和对象的创建
- C语言笔记——简介与编译过程初探
序言 从今天起,详细说说C语言.这一年多,在大多数语言和技术之间转了一大圈,终于看清楚了事实,决心静下心来好好学学C语言.初学者会认为C语言是个入门用的东西,没有必要深入研究.但对计算机领域再稍加了解 ...
- 【自学php】第二天 - php快速入门
打算看<php和mysql web开发>来学习php,所以也算是这本书的学习笔记吧,也按照书里的例子来练习,但是也有些取舍.第一章是一个订单表单的例子,php用于处理提交的表单. 1.先创 ...
- QT 线程池 + TCP 小试(一)线程池的简单实现
*免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用,大概就 ...
- android支付宝支付开发过程
原文:android支付宝支付开发过程 支付宝开发流程: 1.在支付宝申请一个账号并开通开发者功能和移动支付的功能. 支付宝地址:https://auth.alipay.com/login/index ...