用途:检验化验(LIS)实验室设备数据交换解析。

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Text.RegularExpressions; namespace PT.Common
{
/// <summary>
/// HL7解析器
/// </summary>
public static class HL7ToXmlConverter
{
private static XmlDocument _xmlDoc; /// <summary>
/// 把HL7信息转成XML形式
/// 分隔顺序 \n,|,~,^,&
/// </summary>
/// <param name="sHL7">HL7字符串</param>
/// <returns></returns>
public static string ConvertToXml(string sHL7)
{
_xmlDoc = ConvertToXmlObject(sHL7);
return _xmlDoc.OuterXml;
} /// <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 XmlDocument CreateXmlDoc()
{
XmlDocument output = new XmlDocument();
XmlElement rootNode = output.CreateElement("HL7Message");
output.AppendChild(rootNode);
return output;
} /// <summary>
/// 读取XML某节点值
/// </summary>
/// <param name="xmlObject"></param>
/// <param name="path"></param>
/// <returns></returns>
public static string GetText(XmlDocument xmlObject, string path)
{
XmlNode node = xmlObject.DocumentElement.SelectSingleNode(path);
if (node != null)
{
return node.InnerText;
}
else
{
return null;
}
} /// <summary>
/// 读取XML某节点组的第index项
/// </summary>
/// <param name="xmlObject"></param>
/// <param name="path"></param>
/// <param name="index"></param>
/// <returns></returns>
public static string GetText(XmlDocument xmlObject, string path, int index)
{
XmlNodeList nodes = xmlObject.DocumentElement.SelectNodes(path);
if (index <= nodes.Count)
{
return nodes[index].InnerText;
}
else
{
return null;
}
} /// <summary>
/// 读取XML某节点组
/// </summary>
/// <param name="xmlObject"></param>
/// <param name="path"></param>
/// <returns></returns>
public static String[] GetTexts(XmlDocument xmlObject, string path)
{
XmlNodeList nodes = xmlObject.DocumentElement.SelectNodes(path);
String[] arr = new String[nodes.Count];
int index = 0;
foreach (XmlNode node in nodes)
{
arr[index++] = node.InnerText;
}
return arr;
} /// <summary>
/// HL7字符串转XML
/// </summary>
/// <param name="sHL7"></param>
/// <returns></returns>
public static XmlDocument ConvertToXmlObject(string sHL7)
{
_xmlDoc = CreateXmlDoc(); //把HL7分成段
string[] sHL7Lines = sHL7.Split('\r');//经过测试,TCP方式接收的用\r分隔,webService方式接收的用\n分隔 //过滤一些字符
//for (int i = 0; i < sHL7Lines.Length; i++)
//{
// sHL7Lines[i] = Regex.Replace(sHL7Lines[i], @"[^ -~]", "");
//} //遍历每一段
for (int i = 0; i < sHL7Lines.Length; i++)
{
// 判断是否空行
if (sHL7Lines[i] != string.Empty)
{
string sHL7Line = sHL7Lines[i];//某一段 //通过“|”分隔
string[] sFields = HL7ToXmlConverter.GetMessgeFields(sHL7Line); // 为段(一行)创建第一级节点
XmlElement el = _xmlDoc.CreateElement(sFields[0]);
_xmlDoc.DocumentElement.AppendChild(el); //遍历每个“|”与“|”间的内容
for (int a = 0; a < sFields.Length; a++)
{
// 为字段创建第二级节点
XmlElement fieldEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString()); //是否包括HL7的连接符
if (sFields[a] != @"^~\&")//0:如果这一行有任何分隔符,继续分隔。如果没有任何分隔符,可以直接写节点值。
{
//通过"~"分隔
string[] sComponents = HL7ToXmlConverter.GetRepetitions(sFields[a]);
if (1==1)//1:如果可以用“~”分隔,继续分隔;如果没有“~”符,开始用“~”分隔。不管有没有"~"符,都循环分隔
{
for (int b = 0; b < sComponents.Length; b++)
{
XmlElement componentEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString() + "." + b.ToString()); //通过"^"分隔
string[] subComponents = GetComponents(sComponents[b]);
if (subComponents.Length > 1)//2.如果有字组,大部分是没有的
{
for (int c = 0; c < subComponents.Length; c++)
{
//修改了一个错误
string[] subComponentRepetitions = GetSubComponents(subComponents[c]);
if (subComponentRepetitions.Length > 1)
{
for (int d = 0; d < subComponentRepetitions.Length; d++)
{
XmlElement subComponentRepEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString() + "." + b.ToString() + "." + c.ToString() + "." + d.ToString());
subComponentRepEl.InnerText = subComponentRepetitions[d];
componentEl.AppendChild(subComponentRepEl);
}
}
else
{
XmlElement subComponentEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString() + "." + b.ToString() + "." + c.ToString());
subComponentEl.InnerText = subComponents[c];
componentEl.AppendChild(subComponentEl); }
}
fieldEl.AppendChild(componentEl);
}
else //2.如果没有字组了,大部分是没有
{
string[] sRepetitions = HL7ToXmlConverter.GetSubComponents(sComponents[b]);
if (sRepetitions.Length > 1)
{
XmlElement repetitionEl = null;
for (int c = 0; c < sRepetitions.Length; c++)
{
repetitionEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString() + "." + b.ToString() + "." + c.ToString());
repetitionEl.InnerText = sRepetitions[c];
componentEl.AppendChild(repetitionEl);
}
fieldEl.AppendChild(componentEl);
el.AppendChild(fieldEl);
}
else
{
componentEl.InnerText = sComponents[b];
fieldEl.AppendChild(componentEl);
el.AppendChild(fieldEl);
}
}
}
el.AppendChild(fieldEl);
}
}
else
{
//0:如果不可以分隔,可以直接写节点值了。
fieldEl.InnerText = sFields[a];
el.AppendChild(fieldEl);
}
}
}
}
return _xmlDoc;
} //测试方法转XML
//string sHL7asXml = PT.Common.HL7ToXmlConverter.ConvertToXml(hl7Data);
//ThreadUPtextBoxMsg(textBoxMsgAppendText, "\r\n[解析HL7消息]" + sHL7asXml);
XmlDocument xmlObject = PT.Common.HL7ToXmlConverter.ConvertToXmlObject(hl7Data);
String chuang1 = PT.Common.HL7ToXmlConverter.GetText(xmlObject, "PV1/PV1.6/PV1.6.0/PV1.6.0.2", 0);
String chuang2 = PT.Common.HL7ToXmlConverter.GetText(xmlObject, "PV1/PV1.3/PV1.3.0/PV1.3.0.2", 0);
ThreadUPtextBoxMsg(textBoxMsgAppendText, "\r\n[解析HL7消息为XML]" + name + "从" + chuang1 + "床换到" + chuang2 + "床");
}
}

HL7 2.6 解析(XML)的更多相关文章

  1. HL7 2.6解析转XML(C#版)

    HL7 2.6解析转XML(C#版) 项目中需要解析HL7,所以在网上找到解析代码,但错误很多,所以我修改了一下,测试好用. using System; using System.Collection ...

  2. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  3. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  4. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  5. Android之DOM解析XML

    一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...

  6. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  7. Android 使用pull,sax解析xml

    pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...

  8. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  9. java解析xml的三种方法

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

随机推荐

  1. Mongodb在window上启动

    MongoDB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.这里主要讲如何在windows平台下安装MongoDB. 安装最新版本mon ...

  2. android Volley+Gson的使用

    听说Volley框架非常好用,今天试了一下post请求,果然如此,因为我传的是json获取的也是json所以就写了一种关于json的请求,其实其他的代码都差不多.首先要先创建一个全局的变量,请求入队列 ...

  3. 我所用过的nginx的功能

    前言 当我们提起集群时,一般所用的插件就是nginx.nginx功能如今越来越完善.第三方模块也多如牛毛,在此,总结一下不牵扯第三方模块所具有的功能. 基本功能 反向代理 负载均衡 HTTP服务器(动 ...

  4. 爬虫之爬取斗鱼官网LOL部分主播的状态

    一个爬虫小程序 爬取主播的排名及观看人数 import re import requests import request class Spider(): url = 'https://www.dou ...

  5. Python学习:变量

    变量(Variables): 是为了存储程序在运算过程中的一些中间结果,为了方便日后调用储存在计算的内存中 官方介绍: Variables are used to storeinformation t ...

  6. jenkins 构建部署时tomcat7 内存溢出解决方案

    在使用jenkins构建部署时一直出现tomcat7内存溢出 WARNING: Unexpected node monitoring termination: Clock Difference jav ...

  7. hdu畅通工程(并查集)

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道 ...

  8. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;

    正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...

  9. 源码解析:解析掌阅X2C 框架

    前言 掌阅出品了X2C 框架,听说可以加快性能.喜欢研究源码的我,肯定要来看下是怎么回事. 作为一个开发,应该不屑于只会使用开源框架. OK,来尝试下. 项目地址: https://github.co ...

  10. stm32--USB(作为U盘)+FatFs的实现

    一.USB功能的添加(作为U盘) 添加文件 将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹: usb class为硬件相关(Library\Class): usb dri ...