// <span class="code-SummaryComment"><summary></span> /// Converts an HL7 message into a JSON Object from it's XML representation of the same message. /// <span class="code-SummaryComment"></summary></span> /// <span class="code-SummaryComment"><param name="sHL7">The HL7 to convert</param></span> /// <span class="code-SummaryComment"><returns></returns></span> public static string ConvertToJSON(string sHL7, JObject hl7metadata = null) { JObject o = HL7ToXmlConverter.ConvertToJObject(sHL7, hl7metadata); if (o == null) { return(null); } return(JsonConvert.SerializeObject(o["hl7message"])); }
// <span class="code-SummaryComment"><summary></span> /// Converts an HL7 message into a JOject Object from it's XML representation of the same message. /// <span class="code-SummaryComment"></summary></span> /// <span class="code-SummaryComment"><param name="sHL7">The HL7 to convert</param></span> /// <span class="code-SummaryComment"><returns>JObject with root of hl7message</returns></span> public static JObject ConvertToJObject(string sHL7, JObject hl7metadata = null) { var xmld = HL7ToXmlConverter.ConvertToXmlDocument(sHL7, hl7metadata); if (xmld != null) { string json = JsonConvert.SerializeXmlNode(xmld); JObject o = JObject.Parse(json); return(o); } return(null); }
static void Main(string[] args) { //First argument is path to a file that contains a valid HL7 message. (Must follow HL7 rules!!) if (args.Length > 0 && File.Exists(args[0])) { string hl7 = File.ReadAllText(args[0]); JObject obj = HL7ToXmlConverter.ConvertToJObject(hl7); string msgtype = obj["hl7message"]["MSH"]["MSH.9"].GetFirstField(); StringBuilder builder = new StringBuilder(); if (msgtype.Equals("ORU") || msgtype.Equals("MDM")) { if (obj["hl7message"]["OBX"] is JArray) { foreach (var obx in obj["hl7message"]["OBX"]) { if (Utilities.getFirstField(obx["OBX.2"]).Equals("TX") || Utilities.getFirstField(obx["OBX.2"]).Equals("FT")) { builder.Append(Utilities.getFirstField(obx["OBX.5"]).UnEscapeHL7()); builder.Append("\r\n"); } } } else { if (Utilities.getFirstField(obj["hl7message"]["OBX"]["OBX.2"]).Equals("TX") || Utilities.getFirstField(obj["hl7message"]["OBX"]["OBX.2"]).Equals("FT")) { builder.Append(Utilities.getFirstField(obj["hl7message"]["OBX"]["OBX.5"]).UnEscapeHL7()); builder.Append("\r\n"); } } Console.WriteLine(builder.ToString()); Console.ReadLine(); } } else { Console.WriteLine("Please pass in a valid path and file"); } }
/// <span class="code-SummaryComment"><summary></span> /// Converts an HL7 message into an XML representation of the same message. /// <span class="code-SummaryComment"></summary></span> /// <span class="code-SummaryComment"><param name="sHL7">The HL7 to convert</param></span> /// <span class="code-SummaryComment"><returns>XML String with root of hl7message</returns></span> public static string ConvertToXml(string sHL7, JObject hl7metadata = null) { return(HL7ToXmlConverter.ConvertToXmlDocument(sHL7, hl7metadata).OuterXml); }
/// <span class="code-SummaryComment"><summary></span> /// Converts an HL7 message into an XMLDocument representation of the same message. /// <span class="code-SummaryComment"></summary></span> /// <span class="code-SummaryComment"><param name="sHL7">The HL7 to convert</param></span> /// <span class="code-SummaryComment"><returns>XMLDocument with root of hl7message</returns></span> public static XmlDocument ConvertToXmlDocument(string sHL7, JObject metadata = null) { try { if (string.IsNullOrEmpty(sHL7) || !sHL7.StartsWith("MSH")) { return(null); } XmlDocument _xmlDoc = null; // 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 string[] sHL7Lines = sHL7.Split('\r'); // Now we want to replace any other unprintable control // characters with whitespace otherwise they'll break the XML for (int i = 0; i < sHL7Lines.Length; i++) { sHL7Lines[i] = Regex.Replace(sHL7Lines[i], @"[^ -~]", ""); } /// Go through each segment in the message /// and first get the fields, separated by pipe (|), /// then for each of those, get the field components, /// separated by carat (^), and check for /// repetition (~) and also check each component /// for subcomponents, and repetition within them too. for (int i = 0; i < sHL7Lines.Length; i++) { string fs = null; // Don't care about empty lines if (sHL7Lines[i] != string.Empty) { // Get the line and get the line's segments string sHL7Line = sHL7Lines[i]; if (fs == null) { fs = GetFieldSeparator(sHL7Line); } string[] sFields = HL7ToXmlConverter.GetMessgeFields(sHL7Line, fs); // Create a new element in the XML for the line var segmentextract = LookUpSegmentName(metadata, sFields[0]); XmlElement el = _xmlDoc.CreateElement(segmentextract.ExtractedName); if (segmentextract.Repeats) { var attribute = _xmlDoc.CreateAttribute("json", "Array", "http://james.newtonking.com/projects/json"); attribute.InnerText = "true"; el.Attributes.Append(attribute); } _xmlDoc.DocumentElement.AppendChild(el); XmlElement sq = _xmlDoc.CreateElement("msgseq"); sq.InnerText = (i + 1).ToString(); el.AppendChild(sq); // For each field in the line of HL7 for (int a = 1; a < sFields.Length; a++) { var fieldextract = LookUpFieldName(metadata, sFields[0], a.ToString()); // Create a new element XmlElement fieldEl = _xmlDoc.CreateElement(fieldextract.ExtractedName); if (fieldextract.Repeats) { var attribute = _xmlDoc.CreateAttribute("json", "Array", "http://james.newtonking.com/projects/json"); attribute.InnerText = "true"; fieldEl.Attributes.Append(attribute); } /// 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. if (sFields[a] != @"^~\&") { /// Get the components within this field, separated by carats (^) /// If there are more than one, go through and create an element for /// each, then check for subcomponents, and repetition in both. string[] sRepeatingComponent = HL7ToXmlConverter.GetRepetitions(sFields[a]); int rc = 0; foreach (string r in sRepeatingComponent) { XmlElement repeatelement = null; if (sRepeatingComponent.Length > 1) { repeatelement = _xmlDoc.CreateElement(fieldextract.ExtractedName); } string[] sComponents = HL7ToXmlConverter.GetComponents(r); if (sComponents.Length > 1) { for (int b = 0; b < sComponents.Length; b++) { XmlElement componentEl = _xmlDoc.CreateElement(fieldextract.ExtractedName + "." + (b + 1).ToString()); string[] subComponents = GetSubComponents(sComponents[b]); if (subComponents.Length > 1) // There were subcomponents { for (int c = 0; c < subComponents.Length; c++) { // Check for repetition string[] subComponentRepetitions = GetRepetitions(subComponents[c]); if (subComponentRepetitions.Length > 1) { for (int d = 0; d < subComponentRepetitions.Length; d++) { XmlElement subComponentRepEl = _xmlDoc.CreateElement(fieldextract.ExtractedName + "." + (b + 1).ToString() + "." + (c + 1).ToString() + "." + (d + 1).ToString()); subComponentRepEl.InnerText = subComponentRepetitions[d].UnEscapeHL7(); componentEl.AppendChild(subComponentRepEl); } } else { XmlElement subComponentEl = _xmlDoc.CreateElement(fieldextract.ExtractedName + "." + (b + 1).ToString() + "." + (c + 1).ToString()); subComponentEl.InnerText = subComponents[c].UnEscapeHL7(); componentEl.AppendChild(subComponentEl); } } if (sRepeatingComponent.Length > 1) { repeatelement.AppendChild(componentEl); fieldEl.AppendChild(repeatelement); } else { fieldEl.AppendChild(componentEl); } } else // There were no subcomponents { string[] sRepetitions = HL7ToXmlConverter.GetRepetitions(sComponents[b]); if (sRepetitions.Length > 1) { XmlElement repetitionEl = null; for (int c = 0; c < sRepetitions.Length; c++) { repetitionEl = _xmlDoc.CreateElement(sFields[0] + "." + (sRepeatingComponent.Length > 1 ? "." + rc.ToString() : ".") + a.ToString() + "." + (b + 1).ToString() + "." + (c + 1).ToString()); repetitionEl.InnerText = sRepetitions[c].UnEscapeHL7(); componentEl.AppendChild(repetitionEl); } fieldEl.AppendChild(componentEl); el.AppendChild(fieldEl); } else { componentEl.InnerText = sComponents[b].UnEscapeHL7(); if (sRepeatingComponent.Length > 1) { repeatelement.AppendChild(componentEl); el.AppendChild(repeatelement); } else { fieldEl.AppendChild(componentEl); el.AppendChild(fieldEl); } } } } //el.AppendChild(fieldEl); } else { if (sRepeatingComponent.Length > 1) { repeatelement.InnerText = sFields[a].UnEscapeHL7(); el.AppendChild(repeatelement); } else { fieldEl.InnerText = sFields[a].UnEscapeHL7(); el.AppendChild(fieldEl); } } rc++; } } else { fieldEl.InnerText = sFields[a].UnEscapeHL7(); el.AppendChild(fieldEl); } } } } return(_xmlDoc); } catch (Exception exp) { Console.WriteLine(exp.Message); return(null); } }