Validação Xml usando o esquema XSD

O código a seguir me ajuda a validar um arquivo XML com um esquema XSD.

XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(null, xsdFilePath); settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); XmlDocument document = new XmlDocument(); document.Load(xmlFilePath); XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); while (rdr.Read()) { } isValid = true; 

O ValidationEventHandler também me diz quais são os erros, mas não me diz em ‘onde’ ou ’em qual linha’ eles estão localizados. Existe alguma maneira de obter o número da linha onde o XML não é validado?

Isso não faria o que você está depois?

Crie um object XmlReaderSettings e ative avisos por meio desse object.

Infelizmente, parece não haver nenhuma maneira de passar seu próprio object XmlReaderSettings para XmlDocument.Validate() .
Em vez disso, você pode usar um XmlReader validação e um XmlNodeReader para validar um XmlDocument existente (usando um XmlNodeReader com StringReader vez de um XmlDocument )

 XmlDocument x = new XmlDocument(); x.LoadXml(XmlSource); XmlReaderSettings settings = new XmlReaderSettings(); settings.CloseInput = true; settings.ValidationEventHandler += Handler; settings.ValidationType = ValidationType.Schema; settings.Schemas.Add(null, ExtendedTreeViewSchema); settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation ; StringReader r = new StringReader(XmlSource); using (XmlReader validatingReader = XmlReader.Create(r, settings)) { while (validatingReader.Read()) { /* just loop through document */ } } 

E o manipulador:

 private static void Handler(object sender, ValidationEventArgs e) { if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) System.Diagnostics.Trace.WriteLine( String.Format("Line: {0}, Position: {1} \"{2}\"", e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); } 

ValidationEventArgs.Message inclui linha / coluna em seu texto.

ValidationEventArgs.Exception tem campos para linha e coluna.