xmlserializervalidation

我正在使用XmlSerializer来反序列化Xml achives。 但我发现生成的类xsd.exe只提供读取xml的function,但没有validation。 例如,如果文档中缺少一个节点,则生成的类的属性字段将为null,而不是像我预期的那样抛出validationexception。 我怎样才能做到这一点? 谢谢!

以下代码应在反序列化时针对模式进行validation。 类似的代码可用于在序列化时对模式进行validation。

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; } 

以下代码将以编程方式针对模式文件手动加载和validationXML,从而允许您处理任何产生的错误和/或警告 。

 //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 } )); } 

现在显然你希望让xsd.exe生成的类在加载时自动执行此操作(上述方法需要对XML文件进行第二次处理),但预加载validation将允许您以编程方式检测格式错误的输入文件。