Use un XmlReader
configurado para realizar la validación, con la fuente siendo TextReader
.
Puede especificar manualmente el XSD la XmlReader
es utilizar si no quiere depender de declaraciones en el documento de entrada (con XmlReaderSettings.Schemas
propiedad)
Un comienzo (apenas asume declaraciones XSD instancia en la entrada documento) sería:
var settings = new XmlReaderSettings {
ConformanceLevel = ConformanceLevel.Document,
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation |
XmlSchemaValidationFlags.ProcessInlineSchema,
};
int warnings = 0;
int errors = 0;
settings.ValidationEventHandler += (obj, ea) => {
if (args.Severity == XmlSeverityType.Warning) {
++warnings;
} else {
++errors;
}
};
XmlReader xvr = XmlReader.Create(new StringReader(inputDocInString), settings);
try {
while (xvr.Read()) {
// do nothing
}
if (0 != errors) {
Console.WriteLine("\nFailed to load XML, {0} error(s) and {1} warning(s).", errors, warnings);
} else if (0 != warnings) {
Console.WriteLine("\nLoaded XML with {0} warning(s).", warnings);
} else {
System.Console.WriteLine("Loaded XML OK");
}
Console.WriteLine("\nSchemas loaded durring validation:");
ListSchemas(xvr.Schemas, 1);
} catch (System.Xml.Schema.XmlSchemaException e) {
System.Console.Error.WriteLine("Failed to read XML: {0}", e.Message);
} catch (System.Xml.XmlException e) {
System.Console.Error.WriteLine("XML Error: {0}", e.Message);
} catch (System.IO.IOException e) {
System.Console.Error.WriteLine("IO error: {0}", e.Message);
}
Sí, validar y almacenar una gran cantidad de documentos xml de un sistema de terceros para su uso posterior. El XSD siempre es el mismo, así que tu sugerencia, compilar el conjunto de esquemas es muy apreciado, ¡gracias! – Hinek
¿Qué es 'CachedSchemas' en este ejemplo? –
Solo un IDictionary para almacenar en caché los resultados. –
sisve