コード例 #1
0
        /// <summary>
        /// Gets the message fields with proper field number for MSH.
        /// </summary>
        /// <param name="MSH Segment">MSH segment string</param>
        /// <returns>Split MSH Segment</returns>
        private static string[] GetMessageFieldsForMSH(string s)
        {
            string[] sFieldsPlaceHolder = HL7ToXmlConverter.GetMessgeFields(s);
            string[] sFieldsForMSG      = new string[sFieldsPlaceHolder.Length + 1];

            sFieldsForMSG[0] = sFieldsPlaceHolder[0];
            sFieldsForMSG[1] = "|";

            for (int x = 2; x < sFieldsForMSG.Length; x++)
            {
                sFieldsForMSG[x] = sFieldsPlaceHolder[x - 1];
            }

            return(sFieldsForMSG);
        }
コード例 #2
0
        /// <summary>
        /// Converts an HL7 message into an XML representation of the same message.
        /// </summary>
        ///
        /// <param name="sHL7">The HL7 to convert</param>
        /// <returns></returns>
        public static string ConvertToXml(string sHL7, string validationType)
        {
            try
            {
                // Go and create the base XML
                _xmlDoc = CreateXmlDoc();

                // HL7 message segments are terminated by carriage returns,
                // so to get an array of the message segments, split on carriage return
                char[]   delimiter = { '\r', '\n' };
                string[] sHL7Lines = sHL7.Split(delimiter);

                // Now we want to replace any other unprintable control
                // characters with whitespace otherwise they'll break the XML
                int j = -1;
                for (int i = 0; i < sHL7Lines.Length; i++)
                {
                    //sHL7Lines[i] = Regex.Replace(sHL7Lines[i], @"[^-~]", " ");
                    j = sHL7Lines[i].IndexOf(@"<");
                }

                //Retrieve the field separator
                _fieldSeparator = sHL7Lines[0][3];

                //Retrieve the encoding characters
                _componentSeparator    = sHL7Lines[0][4];
                _subComponentSeparator = sHL7Lines[0][7];
                _repetitionSeparator   = '~';
                string encodingCharacters = GetEncodingCharacters
                                                (_componentSeparator, _repetitionSeparator, _escapeCharacter, _subComponentSeparator);

                /// Go through each segment in the message
                /// and first get the fields, separated by pipe (|),
                /// then for each of those, check for repetition (~)
                /// then get the field components,separated by carat (^)
                /// and also check each component for subcomponents.

                for (int i = 0; i < sHL7Lines.Length; i++)
                {
                    // Don't care about empty lines
                    if (sHL7Lines[i] != string.Empty)
                    {
                        // Get the line and get the line's segments
                        string sHL7Line = sHL7Lines[i];

                        string[] sFields;

                        // For the first segment(MSG), handle it so that MSG-1 is a pipe(|)
                        if (i == 0)
                        {
                            sFields = HL7ToXmlConverter.GetMessageFieldsForMSH(sHL7Line);
                        }
                        else
                        {
                            sFields = HL7ToXmlConverter.GetMessgeFields(sHL7Line);
                        }

                        if ((sFields[0] == "OBX" && validationType == "Syndromic Surveillance") ||
                            (sFields[0] == "OBX" && validationType == "Immunization"))
                        {
                            sFields[0] = sFields[0] + "-" + GetComponents(sFields[3])[0];
                        }

                        if (sFields[0] == "OBX" && validationType == "Lab")
                        {
                            // intentionally left blank
                        }

                        // Create a new element in the XML for the line
                        XmlElement el = _xmlDoc.CreateElement(sFields[0]);
                        _xmlDoc.DocumentElement.AppendChild(el);

                        // For each field in the line of HL7
                        for (int a = 0; a < sFields.Length; a++)
                        {
                            // Create a new element

                            /// Part of the HL7 specification is that part
                            /// of the message header defines which characters
                            /// are going to be used to delimit the message
                            /// and since we want to capture the field that
                            /// contains those characters we need
                            /// to just capture them and stick them in an element.intrane
                            if (sFields[a] != encodingCharacters)
                            {
                                string[] fieldRepetitions = GetRepetitions(sFields[a]);
                                if (fieldRepetitions.Length > 1)
                                {
                                    for (int d = 0; d < fieldRepetitions.Length; d++)
                                    {
                                        if (d == 0)
                                        {
                                            XmlElement fieldEl = _xmlDoc.CreateElement(sFields[0] +
                                                                                       "-" + a.ToString());
                                            string[] sComponents = HL7ToXmlConverter.GetComponents
                                                                       (fieldRepetitions[d]);
                                            if (sComponents.Length > 1)
                                            {
                                                for (int b = 0; b < sComponents.Length; b++)
                                                {
                                                    XmlElement componentEl = _xmlDoc.CreateElement
                                                                                 (sFields[0] + "-" + a.ToString() +
                                                                                 "." + (b + 1).ToString());
                                                    string[] subComponents =
                                                        GetSubComponents(sComponents[b]);
                                                    if (subComponents.Length > 1)
                                                    // There were subcomponents
                                                    {
                                                        for (int c = 0; c < subComponents.Length; c++)
                                                        {
                                                            XmlElement subComponentEl =
                                                                _xmlDoc.CreateElement(sFields[0] + "-" +
                                                                                      a.ToString() + "." +
                                                                                      (b + 1).ToString() + "." + (c + 1).ToString());
                                                            subComponentEl.InnerText = subComponents[c];
                                                            componentEl.AppendChild(subComponentEl);
                                                        }
                                                        fieldEl.AppendChild(componentEl);
                                                    }
                                                    else
                                                    {
                                                        componentEl.InnerText = sComponents[b];
                                                        fieldEl.AppendChild(componentEl);
                                                        el.AppendChild(fieldEl);
                                                    }
                                                }
                                                el.AppendChild(fieldEl);
                                            }
                                            else
                                            {
                                                fieldEl.InnerText = fieldRepetitions[d];
                                                el.AppendChild(fieldEl);
                                            }
                                        }
                                        else
                                        {
                                            XmlElement fieldEl = _xmlDoc.CreateElement(sFields[0] +
                                                                                       "-" + a.ToString() + "_" + (d + 1).ToString());
                                            string[] sComponents = HL7ToXmlConverter.GetComponents
                                                                       (fieldRepetitions[d]);
                                            if (sComponents.Length > 1)
                                            {
                                                for (int b = 0; b < sComponents.Length; b++)
                                                {
                                                    XmlElement componentEl = _xmlDoc.CreateElement
                                                                                 (fieldEl.Name + "." + (b + 1).ToString());
                                                    string[] subComponents = GetSubComponents
                                                                                 (sComponents[b]);
                                                    if (subComponents.Length > 1)
                                                    {
                                                        for (int c = 0; c < subComponents.Length; c++)
                                                        {
                                                            XmlElement subComponentEl =
                                                                _xmlDoc.CreateElement(componentEl.Name +
                                                                                      "." + (c + 1).ToString());
                                                            subComponentEl.InnerText = subComponents[c];
                                                            componentEl.AppendChild(subComponentEl);
                                                        }
                                                        fieldEl.AppendChild(componentEl);
                                                    }
                                                    else
                                                    {
                                                        componentEl.InnerText = sComponents[b];
                                                        fieldEl.AppendChild(componentEl);
                                                        el.AppendChild(fieldEl);
                                                    }
                                                }
                                                el.AppendChild(fieldEl);
                                            }
                                            else
                                            {
                                                fieldEl.InnerText = fieldRepetitions[d];
                                                el.AppendChild(fieldEl);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    XmlElement fieldEl = _xmlDoc.CreateElement(sFields[0] + "-" +
                                                                               a.ToString());
                                    string[] sComponents = HL7ToXmlConverter.GetComponents(sFields[a]);
                                    if (sComponents.Length > 1)
                                    {
                                        for (int b = 0; b < sComponents.Length; b++)
                                        {
                                            XmlElement componentEl = _xmlDoc.CreateElement(sFields[0] +
                                                                                           "-" + a.ToString() +
                                                                                           "." + (b + 1).ToString());
                                            string[] subComponents = GetSubComponents(sComponents[b]);
                                            if (subComponents.Length > 1)
                                            // There were subcomponents
                                            {
                                                for (int c = 0; c < subComponents.Length; c++)
                                                {
                                                    XmlElement subComponentEl =
                                                        _xmlDoc.CreateElement(sFields[0] + "-" +
                                                                              a.ToString() + "." +
                                                                              (b + 1).ToString() + "." + (c + 1).ToString());
                                                    subComponentEl.InnerText = subComponents[c];
                                                    componentEl.AppendChild(subComponentEl);
                                                }
                                                fieldEl.AppendChild(componentEl);
                                            }
                                            else
                                            {
                                                componentEl.InnerText = sComponents[b];
                                                fieldEl.AppendChild(componentEl);
                                                el.AppendChild(fieldEl);
                                            }
                                        }
                                        el.AppendChild(fieldEl);
                                    }
                                    else
                                    {
                                        fieldEl.InnerText = sFields[a];
                                        el.AppendChild(fieldEl);
                                    }
                                }
                            }
                            else
                            {
                                XmlElement fieldEl = _xmlDoc.CreateElement(sFields[0] + "-" + a.ToString());
                                fieldEl.InnerText = sFields[a];
                                el.AppendChild(fieldEl);
                            }
                        }
                    }
                }

                return(_xmlDoc.OuterXml);
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
                return(ex.Message.ToString());
            }
        }