C# 如何验证XmlSerializer的输出?

C# 如何验证XmlSerializer的输出?,c#,validation,schema,serialization,xmlserializer,C#,Validation,Schema,Serialization,Xmlserializer,在C#/.NET2.0中,当我使用对象时,根据XML模式验证输出的最简单方法是什么 问题是,使用XmlSerializer编写无效的XML太容易了,而且我找不到一种不麻烦的方法来验证XML。理想情况下,我希望在XmlSerializer中设置模式,或者使用XmlWriter进行验证。您可以根据XSD模式验证XML文件。使用验证读取器再次读取它怎么样 这里有一个快速的尝试 Stream stream = new MemoryStream(Encoding.UTF8.GetBytes("<Yo

在C#/.NET2.0中,当我使用对象时,根据XML模式验证输出的最简单方法是什么


问题是,使用XmlSerializer编写无效的XML太容易了,而且我找不到一种不麻烦的方法来验证XML。理想情况下,我希望在XmlSerializer中设置模式,或者使用XmlWriter进行验证。

您可以根据XSD模式验证XML文件。

使用验证读取器再次读取它怎么样

这里有一个快速的尝试

Stream stream = new MemoryStream(Encoding.UTF8.GetBytes("<YourXml />"));
var input = mappingAssembly.GetManifestResourceStream(
            "MySchema.xsd"
            ); //This could be whatever resource your schema is           
var schemas = new XmlSchemaSet();            
schemas.Add(
   "urn:YourSchemaUrn",
   XmlReader.Create(
      input
      )
 );

var settings = new XmlReaderSettings
                           {
                               ValidationType = ValidationType.Schema,
                               Schemas = schemas
                           };

settings.ValidationEventHandler += MakeAHandlerToHandleAnyErrors;

var reader = XmlReader.Create(stream, settings);
while (reader.Read()) {} //Makes it read to the end, therefore validates
Stream=newmemoryStream(Encoding.UTF8.GetBytes(“”);
var input=mappingAssembly.GetManifestResourceStream(
“MySchema.xsd”
); //这可以是模式中的任何资源
var schemase=new XmlSchemaSet();
架构。添加(
“urn:YourSchemaUrn”,
创建(
输入
)
);
var设置=新的XmlReaderSettings
{
ValidationType=ValidationType.Schema,
模式=模式
};
settings.ValidationEventHandler+=makeahandlertohandleyerrors;
var reader=XmlReader.Create(流、设置);
而(reader.Read()){}//使其读到底,因此验证

当出现错误时,您需要一些处理程序来执行某些操作。

True,但这意味着我必须编写XML,将其存储在某个位置,然后再次读取。我曾希望有一种更简单的方法可以在运行时进行验证。XmlSerializer不支持根据XSD模式进行验证,因为它应该从一个应该始终有效的对象生成XML。但事实并非如此。如果必需元素的值为null,则它们似乎被省略。XmlSerializer可能还不支持其他内容(字符串的长度和模式约束、唯一性、键引用)。您不能将属性添加到要序列化的类的属性中以使它们成为必需的,那么相应的元素将被包括在内,但没有值。例如,当反序列化此类内容时,空值和空字符串之间会产生差异。像.NET 4中的[XmlElement(IsNullable=true)]一样,存在捕获意外元素的事件。