public static bool ValidateXml( string xml, string targetNamespace, StringBuilder sb )
{
_validationErrors.Clear();
//---------------------------------------------------------------//
//--- TODO: Convert to xml and use XSLT to format for display ---//
//---------------------------------------------------------------//
string byteOrderMarkUtf8 = Encoding.UTF8.GetString( Encoding.UTF8.GetPreamble() );
if (xml.StartsWith( byteOrderMarkUtf8 ))
xml = xml.Remove( 0, byteOrderMarkUtf8.Length );
sb.Append(
"<h3 style=\"font-family:sans-serif;\" >The ATML XML has FAILED a standard validation against the specification XSD with the following errors: </h3>" );
//error = null;
bool validXml = true;
try
{
var reader = new StringReader( xml );
var settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessIdentityConstraints;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += settings_ValidationEventHandler;
XmlReader xr = XmlReader.Create( reader, settings );
XDocument document = XDocument.Load( xr );
if (!Instance._schemaSets.ContainsKey( targetNamespace ))
{
string msg = string.Format( "<strong>Namespace \"{0}\" does not belong to the current schema set and therefore cannot be validated at this time.</strong>", targetNamespace );
throw new Exception( msg );
}
else
{
XmlSchemaSet ss = Instance._schemaSets[targetNamespace];
var errors = new List<string>();
document.Validate( ss, ( o, err ) =>
{
var name =
new StringBuilder( "<strong><span style=\"font-family:sans-serif;\">" );
var element = o as XElement;
var attribute = o as XAttribute;
if (attribute != null)
{
element = attribute.Parent;
}
if (element != null)
{
int indent = BuildParentTree( element, name );
name.Append( "</span></strong>" );
sb.Append( "<br/>" );
sb.Append( "<div style=\"border:black solid 1px;padding:5px;\">" );
sb.Append( name );
sb.Append( "<br/>" )
.Append(
"<div style=\"color:red;font-family:sans-serif;padding-left:" )
.Append( 20*indent )
.Append( "px;\">" );
sb.Append( err.Message ).Append( "</div><br/><br/>" );
errors.Add( sb.ToString() );
if (err.Severity == XmlSeverityType.Error)
Instance.OnError( err.Message, null );
if (err.Severity == XmlSeverityType.Warning)
Instance.OnWarning( err.Message, null );
validXml = false;
sb.Append( "</div>" );
}
else
{
int i = 0;
}
}, true );
}
}
catch (Exception e)
{
validXml = false;
try
{
Instance.OnError( e.Message, sb.ToString() );
sb.Append( e.Message + "<br/><pre>" + e.StackTrace + "</pre>" );
}
catch (Exception ee)
{
sb.Append( "An error occurred while processing a validation error<br/>" + ee.Message + "<br/>" );
}
}
if (!validXml)
{
try
{
//error = sb.ToString();
}
catch (Exception)
{
MessageBox.Show( string.Format( "Failed to retrieve validation error message - size:{0}", sb.Length ) );
}
}
if (_validationErrors.Length > 0)
{
validXml = false;
sb.Append( _validationErrors );
}
return validXml;
}