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. iOS FieldField Validation
- 3. Java Validation Frameworks
- 4. Rails form validation
- 5. Jquery RegEx Validation
- 6. jquery validation only digits
- 7. MVC.net JQuery Validation
- 8. Zend_Form int validation ..?
- 9. AJAX Rails Validation
- 10. Django ModelForm Validation
- 11. Control Eclipse Validation
- 12. XmlSerializer y WhiteSpace incrustado
- 13. XmlSerializer codificación UTF-8
- 14. Conversor de propiedades XmlSerializer
- 15. XmlSerializer no serializará IEnumerable
- 16. XMLSerializer para XElement
- 17. Advanced Date-Validation con PHP
- 18. Web User Controls and Validation
- 19. Mysterious Eclipse JSP Validation Errors
- 20. .Net WebService, bypass ssl validation!
- 21. JSF2 i18n bean validation messages
- 22. XSD Schema Validation en Ruby
- 23. DDD Domain Model Complex Validation
- 24. Grails JQuery Ajax Form Validation
- 25. jQuery Validation plugin - Mensaje personalizado
- 26. ASP.NET MVC Model/ViewModel Validation
- 27. atributo no serializado por XmlSerializer
- 28. XmlSerializer. Omitir xml nodo desconocido
- 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