2012-01-09 7 views
5

Estoy intentando validar un fragmento Xml usando un esquema Xml con el método de extensión XDocument.Validate. Siempre que un fragmento de XML no válido se utiliza el fuego ValidationEventHandler correctamente, sin embargo tanto las propiedades lineNumber y LinePosition del XmlSchemaValidationException son 0.XmlSchemaValidationException.LineNumber y LinePosition son 0 al validar un esquema Xml con XDocument.Validate

private bool Validate(XDocument doc) 
{ 
    bool isValid = true; 
    List<string> validationErrors = new List<string>(); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add(null, "MyCustomSchema.xsd"); 

    doc.Validate(schemas, (sender, args) => 
    { 
     validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
      args.Severity, 
      args.Exception.Message, 
      args.Exception.LineNumber, 
      args.Exception.LinePosition)); 

     isValid = false; 
    }, false); 

    return isValid; 
} 

Mi objetivo en el ejemplo anterior es utilizar validationErrors para informar a un usuario de por qué el validación fallida. Sin embargo, cuando se usa este método, LineNumber y LinePosition son 0.

El fragmento parece bastante simple y parece funcionar como se espera en términos de validación contra fragmentos Xml válidos e inválidos.

¡Gracias de antemano!

+0

Por lo que puedo ver, el XmlSchemaValidator que se instancia solo usa una DummyPostion interna y no veo una opción para obtener una mejor implementación inyectada. – rene

Respuesta

4

Ya no está validando la representación textual del Xml, sino el modelo del objeto. Como resultado, no hay líneas y posiciones porque no hay ningún archivo sino objetos XElement, XAttribute, etc. en la memoria. Otra sugerencia útil sería preguntarse: ¿qué línea y posición deberían devolverse si modificó (por ejemplo, se agregó un elemento) el XDocument después de que se cargó pero antes de ejecutar la validación? Si no está creando o modificando el Xml, la manera más rápida sería usar XmlReader para validar su documento Xml. Como beneficio adicional, si la entrada es un archivo o una secuencia, debe obtener información de línea y posición en caso de errores de validación.

+0

Pawel, gracias por su respuesta muy razonable. Quería validar contra el XDocument, ya que ya tenía una referencia. Cambiaré mi aplicación para validarla frente a un XmlReader, y luego crearé la referencia de XDocument cuando sea necesario. – buckindb

+0

Creo que debería poder hacer ambas cosas al mismo tiempo: puede configurar el lector para que valide el documento y luego pase el lector al método XDocument.Load() ... – Pawel

Cuestiones relacionadas