HL7 2.X解析(C#版)

來源:互聯網
上載者:User

Hl7引擎的目標主要是解決將資料按HL7協議的要求標準化,和標準業務的整合和不同系統間標準業務資料的同步。在多年的醫院整合平台資訊化過程中,HL7標準組織和解析最複雜了,下面是我用了多年HL7引擎解析,因公司升級使用了HL73.0版本,決定把HL72.X引擎放到部落格上儲存。

 

(引擎解析類)Decode.cs

using System;using System.Collections.Generic;using System.Text;using System.Xml;using System.Text.RegularExpressions;namespace com.china.hl7{    /// <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;        }        public static XmlDocument ConvertToXmlObject(string sHL7)        {            _xmlDoc = CreateXmlDoc();            //把HL7分成段            string[] sHL7Lines = sHL7.Split('\n');            //去掉XML的關鍵字            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];                    //通過/r 或/n 斷行符號符分隔                    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 (sComponents.Length > 1)                            {//1:如果可以分隔                                for (int b = 0; b < sComponents.Length; b++)                                {                                    XmlElement componentEl = _xmlDoc.CreateElement(sFields[0] + "." + a.ToString() + "." + b.ToString());                                    //通過&分隔                                     string[] subComponents = GetSubComponents(sComponents[b]);                                    if (subComponents.Length > 1)                                    {//2.如果有字組,一般是沒有的。。。                                        for (int c = 0; c < subComponents.Length; c++)                                        {                                            //修改了一個錯誤                                            string[] subComponentRepetitions = GetComponents(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.GetComponents(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                            {//1:如果不可以分隔,可以直接寫節點值了。                                fieldEl.InnerText = sFields[a];                                el.AppendChild(fieldEl);                            }                        }                        else                        {//0:如果不可以分隔,可以直接寫節點值了。                            fieldEl.InnerText = sFields[a];                            el.AppendChild(fieldEl);                        }                    }                }            }            return _xmlDoc;        }        /// <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;        }        public static string GetText(XmlDocument xmlObject, string path)        {            XmlNode node = xmlObject.DocumentElement.SelectSingleNode(path);            if (node != null)            {                return node.InnerText;            }            else            {                return null;            }        }        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;            }                    }        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;        }    }}

測試方法:

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";string sHL7asXml = HL7ToXmlConverter.ConvertToXml(myHL7string);XmlDocument xmlObject = HL7ToXmlConverter.ConvertToXmlObject(myHL7string);String value = HL7ToXmlConverter.GetText(xmlObject, "QRD/QRD.9/QRD.9.0",0);String value2 = HL7ToXmlConverter.GetText(xmlObject, "QRD/QRD.9/QRD.9.0");String nodeValue = xmlObject.DocumentElement.SelectSingleNode("MSH/MSH.1").InnerText;String nodeValue2 = xmlObject.DocumentElement.SelectSingleNode("QRD/QRD.9/QRD.9.0").InnerText;   

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.