Exemplo n.º 1
0
        /// <summary>
        /// Reads a given sample XML document from the path specfied and scans it for Errors and Warnings 
        /// </summary>
        /// <param name="path"></param>
        /// <returns>An instance of PostalAddressResult</returns>
        public PostalAddressResult Read(string path)
        {
            var result = new PostalAddressResult();
            using (var xmlReader = new XmlTextReader(string.Format(@"{0}\{1}\{2}", DataFolder, XmlFolder, path)))
            {
                var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
                settings.Schemas.Add("urn:PostalAddress-schema", string.Format(@"{0}\{1}", DataFolder, SchemaFileName));
                using (var xmlValidatingReader = XmlReader.Create(xmlReader, settings))
                {
                    var serializer = new XmlSerializer(typeof(PostalAddress));
                    PostalAddress postalAddress = null;
                    try
                    {
                        // Deserialise the XML to PostalAddress
                        postalAddress = (PostalAddress)serializer.Deserialize(xmlValidatingReader);
                    }
                    catch
                    {
                        result.SummaryMessage = "Scan Aborted as the XML document does not meet the XSD schema";
                        return result;
                    }
                    result.IsDocumentValid = true;
                    // Detect Errors in the document
                    DetectErrors(postalAddress, result);
                    if (result.ExceedsErrorThreshold)
                    {
                        // Abort scan
                        return result;
                    }
                    // Detect Warnings in the document
                    DetectWarnings(postalAddress, result);

                    //Create a scan summary message for errors and warnings
                    result.SummaryMessage = string.Format("Scan completed with {0} errors and {1} warnings",
                        result.Errors.Count(),
                        result.Warnings.Count());
                }
            }
            return result;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Detects warning messages for a given XML document based on some rules
        /// </summary>
        /// <param name="postalAddress"></param>
        /// <param name="result"></param>
        private void DetectWarnings(PostalAddress postalAddress, PostalAddressResult result)
        {
            var countryList = ConfigurationManager.AppSettings.Get("CountryList") ?? DefaultCountryList;
            var permittedCountries = countryList.Split(new[] { ',' });
            foreach (var address in postalAddress.PostalAddresses)
            {
                string tag = null;
                Warning warning = null;
                if (string.IsNullOrEmpty(address.City))
                {
                    tag = "<city/>";
                    warning = new Warning() { Message = string.Format("The {0} tag is empty", tag), Tag = tag };

                }
                else if(!permittedCountries.Contains(address.Country))
                {
                    tag = "<country/>";
                    warning = new Warning()
                    {
                        Message = string.Format("{0} isn't within permitted set of countries",
                        address.Country.Trim()),
                        Tag = tag
                    };
                }
                if (warning != null)
                {
                    result.AddWarning(warning);
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Detects errors in an XML document during scan based on some validation rules
        /// </summary>
        /// <param name="postalAddress"></param>
        /// <param name="result"></param>
        private void DetectErrors(PostalAddress postalAddress, PostalAddressResult result)
        {
            var count = postalAddress.PostalAddresses.Count();
            foreach (var address in postalAddress.PostalAddresses)
            {
                string tag = null;
                if (string.IsNullOrEmpty(address.Address1))
                {
                    tag = "<address1/>";
                }
                else if (string.IsNullOrEmpty(address.PostCode))
                {
                    tag = "<postcode/>";
                }

                if (tag != null)
                {
                    //Abort scan if 10% of records in the document contain errors
                    if (result.Errors.Count() > count / 10)
                    {
                        result.ExceedsErrorThreshold = true;
                        result.SummaryMessage = "Scan aborted as more than 10% of records contained errors";
                        break;
                    }
                    var error = new Error() { Message = string.Format("The {0} tag is empty", tag), Tag = tag };
                    result.AddError(error);
                }
            }
        }