public virtual bool ValidateObjectXML(string source, string target, List <string> properties, TokenParser tokenParser = null, Dictionary <string, string[]> parsedProperties = null)
        {
            XElement sourceXml = XElement.Parse(source);
            XElement targetXml = XElement.Parse(target);

            if (tokenParser != null && parsedProperties != null)
            {
                // Run token parser over provided list of properties
                foreach (var property in properties)
                {
                    if (sourceXml.Attribute(property) != null)
                    {
                        string[] parserExceptions;
                        parsedProperties.TryGetValue(property, out parserExceptions);
                        sourceXml.Attribute(property).Value = tokenParser.ParseString(sourceXml.Attribute(property).Value, parserExceptions);
                        if (targetXml.Attribute(property) != null)
                        {
                            targetXml.Attribute(property).Value = tokenParser.ParseString(targetXml.Attribute(property).Value, parserExceptions);
                        }
                    }
                }
            }

            // call virtual override method, consuming validators can add fixed validation logic if needed
            OverrideXmlData(sourceXml, targetXml);

            // call event handler, validator instances can add additional validation behaviour if needed, including forcing an IsEqual
            ValidateXmlEventArgs e = null;

            if (ValidateXmlEvent != null)
            {
                e = new ValidateXmlEventArgs(sourceXml, targetXml);
                ValidateXmlEvent(this, e);
            }

            if (e != null && e.IsEqual)
            {
                // Do nothing since we've declared equality in the event handler
            }
            else
            {
                // Not using XNode.DeepEquals anymore since it requires that the attributes in both XML's are ordered the same
                //var equalNodes = XNode.DeepEquals(sourceXml, targetXml);
                var equalNodes = XmlComparer.AreEqual(sourceXml, targetXml);
                if (!equalNodes.Success)
                {
                    Console.WriteLine(string.Format("Source XML:{0}", sourceXml.ToString()));
                    Console.WriteLine(string.Format("Target XML:{0}", targetXml.ToString()));
                    return(false);
                }
            }

            return(true);
        }
        public virtual bool ValidateObjectsXML <T>(IEnumerable <T> sElements, IEnumerable <T> tElements, string XmlPropertyName, List <string> properties, TokenParser tokenParser = null, Dictionary <string, string[]> parsedProperties = null) where T : class
        {
            string key         = properties[0];
            int    sourceCount = 0;
            int    targetCount = 0;

            foreach (var sElem in sElements)
            {
                sourceCount++;
                string sourceXmlString = sElem.GetType().GetProperty(XmlPropertyName).GetValue(sElem).ToString();

                if (tokenParser != null && parsedProperties != null)
                {
                    if (parsedProperties.ContainsKey(XmlPropertyName))
                    {
                        string[] parserExceptions;
                        parsedProperties.TryGetValue(XmlPropertyName, out parserExceptions);
                        sourceXmlString = tokenParser.ParseString(Convert.ToString(sourceXmlString), parserExceptions);
                    }
                }

                XElement sourceXml      = XElement.Parse(sourceXmlString);
                string   sourceKeyValue = sourceXml.Attribute(key).Value;

                foreach (var tElem in tElements)
                {
                    string targetXmlString = tElem.GetType().GetProperty(XmlPropertyName).GetValue(tElem).ToString();

                    if (tokenParser != null && parsedProperties != null)
                    {
                        if (parsedProperties.ContainsKey(XmlPropertyName))
                        {
                            string[] parserExceptions;
                            parsedProperties.TryGetValue(XmlPropertyName, out parserExceptions);
                            targetXmlString = tokenParser.ParseString(Convert.ToString(targetXmlString), parserExceptions);
                        }
                    }

                    XElement targetXml      = XElement.Parse(targetXmlString);
                    string   targetKeyValue = targetXml.Attribute(key).Value;

                    if (sourceKeyValue.Equals(targetKeyValue, StringComparison.InvariantCultureIgnoreCase))
                    {
                        targetCount++;

                        // compare XML's

                        // call virtual override method, consuming validators can add fixed validation logic if needed
                        OverrideXmlData(sourceXml, targetXml);

                        // call event handler, validator instances can add additional validation behaviour if needed, including forcing an IsEqual
                        ValidateXmlEventArgs e = null;
                        if (ValidateXmlEvent != null)
                        {
                            e = new ValidateXmlEventArgs(sourceXml, targetXml);
                            ValidateXmlEvent(this, e);
                        }

                        if (e != null && e.IsEqual)
                        {
                            // Do nothing since we've declared equality in the event handler
                        }
                        else
                        {
                            // Not using XNode.DeepEquals anymore since it requires that the attributes in both XML's are ordered the same
                            //var equalNodes = XNode.DeepEquals(sourceXml, targetXml);
                            var equalNodes = XmlComparer.AreEqual(sourceXml, targetXml);
                            if (!equalNodes.Success)
                            {
                                Console.WriteLine(string.Format("Source XML:{0}", sourceXml.ToString()));
                                Console.WriteLine(string.Format("Target XML:{0}", targetXml.ToString()));
                                return(false);
                            }
                        }

                        break;
                    }
                }
            }

            return(sourceCount == targetCount);
        }