Estoy usando XmlSerializer para deserializar Xml Achives. Pero encontré que la clase xsd.exe generada solo ofrece la capacidad de leer el xml, pero no la validación. Por ejemplo, si falta un nodo en un documento, el campo de atributo de la clase generada será nulo, en lugar de arrojar una excepción de validación como esperaba. ¿Cómo puedo lograr eso? ¡Gracias!xmlserializer validation
Respuesta
El siguiente código debe validar contra un esquema mientras se deserializa. Se puede usar un código similar para validar frente a un esquema durante la serialización.
private static Response DeserializeAndValidate(string tempFileName)
{
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(LoadSchema());
Exception firstException = null;
var settings = new XmlReaderSettings
{
Schemas = schemas,
ValidationType = ValidationType.Schema,
ValidationFlags =
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ReportValidationWarnings
};
settings.ValidationEventHandler +=
delegate(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
{
Console.WriteLine(args.Message);
}
else
{
if (firstException == null)
{
firstException = args.Exception;
}
Console.WriteLine(args.Exception.ToString());
}
};
Response result;
using (var input = new StreamReader(tempFileName))
{
using (XmlReader reader = XmlReader.Create(input, settings))
{
XmlSerializer ser = new XmlSerializer(typeof (Response));
result = (Response) ser.Deserialize(reader);
}
}
if (firstException != null)
{
throw firstException;
}
return result;
}
El siguiente código cargará y validará su XML manualmente contra un archivo de esquema mediante programación, lo que le permite tratar cualquier resulting errors and/or warnings.
//Read in the schema document
using (XmlReader schemaReader = XmlReader.Create("schema.xsd"))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
//add the schema to the schema set
schemaSet.Add(XmlSchema.Read(schemaReader,
new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
}
)));
//Load and validate against the programmatic schema set
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Schemas = schemaSet;
xmlDocument.Load("something.xml");
xmlDocument.Validate(new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
//Report or respond to the error/warning
}
));
}
Ahora es obvio que el deseo de tener las clases generadas por xsd.exe hacer esto de forma automática y durante la carga (el enfoque anterior requeriría una segunda manejo del archivo XML), sino una validación precarga permitiría usted para detectar mediante programación un archivo de entrada mal formado.
@ John Saunders - Estoy dudando de que el código de generación de la clase es probable que cambie su funcionamiento en el corto plazo, y el sitio de MSDN no muestra opciones relevantes para xsd.exe, así que creo que es razonable sugerir una solución alternativa ... – el2iot2
En el texto de la pregunta, el OP expresa que quiere que se genere una excepción para un xml de entrada no válido. Este enfoque logra eso. No estoy afirmando que esta es la única forma en que se puede hacer, o incluso que es la mejor manera. Pero estaba respondiendo con un enfoque (fuera de lo común) que había utilizado en el pasado para validar documentos XML en general. – el2iot2
- 1. WPF TextBox Validation
- 2. Jquery RegEx Validation
- 3. MVC.net JQuery Validation
- 4. AJAX Rails Validation
- 5. Django ModelForm Validation
- 6. Twitter Name Validation
- 7. iOS FieldField Validation
- 8. Rails form validation
- 9. Java Validation Frameworks
- 10. Zend_Form int validation ..?
- 11. Control Eclipse Validation
- 12. jquery validation only digits
- 13. XmlSerializer no serializará IEnumerable
- 14. XMLSerializer para XElement
- 15. XmlSerializer codificación UTF-8
- 16. Conversor de propiedades XmlSerializer
- 17. XmlSerializer y WhiteSpace incrustado
- 18. facebook username validation regex pattern
- 19. Mysterious Eclipse JSP Validation Errors
- 20. XSD Schema Validation en Ruby
- 21. Web User Controls and Validation
- 22. Grails JQuery Ajax Form Validation
- 23. jQuery Validation plugin - Mensaje personalizado
- 24. ASP.NET MVC Model/ViewModel Validation
- 25. DDD Domain Model Complex Validation
- 26. .Net WebService, bypass ssl validation!
- 27. Advanced Date-Validation con PHP
- 28. JSF2 i18n bean validation messages
- 29. Rendimiento: BinaryFormatter frente a XmlSerializer
- 30. quitar la codificación de XmlSerializer
Gracias por compartir esta solución. Como esto pone la validación en línea con la deserialización mediante la validación a través de XmlReader, es un mejor enfoque. – el2iot2