コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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&lt;string&gt; brokenRules = (List&lt;string&gt;)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);
        }
コード例 #3
0
ファイル: MessageContext.cs プロジェクト: krankin/ediFabric
        /// <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);
        }
コード例 #4
0
ファイル: MessageContext.cs プロジェクト: krankin/ediFabric
        /// <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;
        }