2010-09-08 52 views
7

Obtengo una variable de cadena con XML y tengo un archivo XSD. Tengo que validar el XML en la cadena contra el archivo XSD y saber que hay más de una forma (XmlDocument, XmlReader, ...?).La forma más eficaz de validar XML contra XSD

Después de la validación solo tengo que almacenar el XML, por lo que no lo necesito en un XDocument o XmlDocument.

¿Cuál es el camino a seguir si quiero el rendimiento más rápido?

Respuesta

9

Otros ya han mencionado la clase XmlReader para hacer la validación, y no voy a dar más detalles en eso.

Su pregunta no especifica mucho contexto. ¿Harás esta validación repetidamente para varios documentos xml, o solo una vez? Estoy leyendo un escenario en el que solo está validando una gran cantidad de documentos xml (¿de un sistema de terceros?) Y los almacena para usarlos en el futuro.

Mi contribución a la búsqueda de rendimiento sería utilizar un compilado XmlSchemaSet que sería seguro para subprocesos, por lo que varios subprocesos pueden reutilizarlo sin necesidad de analizar el documento xsd de nuevo.

var xmlSchema = XmlSchema.Read(stream, null); 
var xmlSchemaSet = new XmlSchemaSet(); 
xmlSchemaSet.Add(xmlSchema); 
xmlSchemaSet.Compile(); 

CachedSchemas.Add(name, xmlSchemaSet); 
+0

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

+1

¿Qué es 'CachedSchemas' en este ejemplo? –

+0

Solo un IDictionary para almacenar en caché los resultados. – sisve

3

Me gustaría ir al XmlReader con XmlReaderSettings porque no necesita cargar el XML completo en la memoria. Será más eficiente para grandes archivos XML.

0

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); 
} 
Cuestiones relacionadas