/// <summary> /// Converts xml edi into message context /// </summary> /// <param name="message"> /// The xml edi. /// </param> /// <returns> /// The message context. /// </returns> private Tuple <string, string, string, EdiFormats> ToContextX12(XElement message) { XNamespace ns = message.Name.NamespaceName; var st = message.Element(ns + "S_" + EdiSegments.St); if (st == null) { throw new ParserException("Can't find ST segment."); } if (message.Parent == null || message.Parent.Parent == null || message.Parent.Parent.Parent == null || message.Parent.Parent.Parent.Parent == null) { throw new ParserException("Can't find GROUP segment."); } var gs = message.Parent.Parent.Parent.Parent.Element(ns + "S_" + EdiSegments.Gs); if (gs == null) { throw new ParserException("Can't find GS segment."); } var tag = st.Element(ns + EdiElements.StTag) ?? st.Element(ns + EdiElements.StTagHipaa); if (tag == null) { throw new ParserException("Can't find " + EdiElements.StTag); } var version = gs.Element(ns + EdiElements.GsVersion); if (version == null) { throw new ParserException("Can't find " + EdiElements.GsVersion); } if (version.Value.Length < 6) { throw new ParserException("Version length should be at least 6."); } var versionString = version.Value.Substring(0, 6); string origin = null; if (version.Value.Count() > 10) { origin = version.Value.Substring(6, 4); } var format = HipaaHelper.IsHipaa(versionString + origin) ? EdiFormats.Hipaa : EdiFormats.X12; return(new Tuple <string, string, string, EdiFormats>(tag.Value, versionString, origin, format)); }
/// <summary> /// Validates the XML EDI against XSD. /// Dynamically finds the appropriate XSD from the validation assembly. /// </summary> /// <param name="definitionsAssemblyName"> /// The assembly name of the project containing the classes. /// </param> /// <returns> /// List of broken rules. /// This lists out all of the validation failures. /// </returns> /// <example> /// Validate message with XSD in the default assembly EdiFabric.Validators.dll. /// <code lang="C#"> /// var interchange = new Interchange(); /// // Construct the object... /// List<string> brokenRules = (List<string>)interchange.Groups[0].Messages[0].Validate(); /// </code> /// </example> public IEnumerable <string> Validate(string definitionsAssemblyName = null) { var validators = definitionsAssemblyName ?? GetAssemblyName(); var result = new List <string>(); var schemas = new XmlSchemaSet(); // Find the assembly containing the XSD var assembly = Assembly.Load(new AssemblyName(validators)); if (assembly == null) { throw new Exception( string.Format("Can't load assembly {0}. Please make sure your project has a reference to it.", validators)); } // Build the XSD name var postfix = HipaaHelper.GetPostfix(Context.Origin); var format = Context.Format.ToString().ToUpper(); if (Context.Format == EdiFormats.Edifact) { format = "EFCT"; } var resource = string.Format("{0}.EF_{1}_{2}_{3}{4}.xsd", validators, format, Context.Version, Context.Tag, postfix != null ? "_" + postfix : ""); // Get the XSD var stream = assembly.GetManifestResourceStream(resource); if (stream == null) { throw new Exception( string.Format( "Can't find resource {0} in assembly {1}. Please make sure that it exists, VS default namespace is the same as the assembly name and its Build Action is set to Embedded Resource.", resource, validators)); } schemas.Add(Item.Name.Namespace.NamespaceName, XmlReader.Create(stream)); // Validate against the XSD var xDoc = new XDocument(Item); xDoc.Validate(schemas, (o, e) => result.Add(e.Message)); return(result); }
/// <summary> /// Converts EDI interchange headers into message context. /// </summary> /// <param name="envelopes">The interchange headers.</param> /// <param name="interchangeContext">The interchange context.</param> private void ToContextX12(IEnumerable <string> envelopes, InterchangeContext interchangeContext) { var enumerable = envelopes as List <string> ?? envelopes.ToList(); string version; string origin; string format; string tag; try { var gs = enumerable.Single(es => es.StartsWith(EdiSegments.Gs)); var ediCompositeDataElementsGs = EdiHelper.GetEdiCompositeDataElements(gs, interchangeContext); version = ediCompositeDataElementsGs[7].Substring(0, 6); origin = ediCompositeDataElementsGs[7].Count() >= 10 ? ediCompositeDataElementsGs[7].Substring(6, 4) : null; format = HipaaHelper.IsHipaa(version + origin) ? EdiFormats.Hipaa.ToString() : EdiFormats.X12.ToString(); if (!HipaaHelper.IsHipaa(version + origin)) { origin = null; } } catch (Exception ex) { throw new ParserException("Can't parse GS segment.", ex); } try { var st = enumerable.Single(es => es.StartsWith(EdiSegments.St)); var ediCompositeDataElementsSt = EdiHelper.GetEdiCompositeDataElements(st, interchangeContext); tag = ediCompositeDataElementsSt[0]; } catch (Exception ex) { throw new ParserException("Can't parse ST segment.", ex); } Tag = tag; Version = version; Origin = origin; Format = ToFormat(format); }
/// <summary> /// Converts XML EDI into message context. /// </summary> /// <param name="message"> /// The XML EDI. /// </param> private void ToContextX12(XElement message) { XNamespace ns = message.Name.NamespaceName; var st = message.Element(ns + "S_" + EdiSegments.St); if (st == null) { throw new ParserException("Can't find ST segment."); } if (message.Parent == null || message.Parent.Parent == null || message.Parent.Parent.Parent == null || message.Parent.Parent.Parent.Parent == null) { throw new ParserException("Can't find GROUP segment."); } var gs = message.Parent.Parent.Parent.Parent.Element(ns + "S_" + EdiSegments.Gs); if (gs == null) { throw new ParserException("Can't find GS segment."); } XElement tag = null; if (st.Descendants().Any(x => x.Name.LocalName.IndexOf(EdiElements.StTag, StringComparison.Ordinal) != -1)) { tag = st.Descendants().First(x => x.Name.LocalName.IndexOf(EdiElements.StTag, StringComparison.Ordinal) != -1); } else if (st.Descendants().Any(x => x.Name.LocalName.IndexOf(EdiElements.StTagHipaa, StringComparison.Ordinal) != -1)) { tag = st.Descendants().First(x => x.Name.LocalName.IndexOf(EdiElements.StTagHipaa, StringComparison.Ordinal) != -1); } if (tag == null) { throw new ParserException("Can't find " + EdiElements.StTag); } var version = gs.Element(ns + EdiElements.GsVersion); if (version == null) { throw new ParserException("Can't find " + EdiElements.GsVersion); } if (version.Value.Length < 6) { throw new ParserException("Version length should be at least 6."); } var versionString = version.Value.Substring(0, 6); string origin = null; if (version.Value.Count() >= 10) { origin = version.Value.Substring(6, 4); } var format = HipaaHelper.IsHipaa(versionString + origin) ? EdiFormats.Hipaa : EdiFormats.X12; Tag = tag.Value; Version = versionString; Origin = origin; Format = format; }