【问题标题】:How can I validate the output of XmlSerializer?如何验证 XmlSerializer 的输出?
【发布时间】:2011-01-25 08:42:02
【问题描述】:

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

问题是用 XmlSerializer 编写无效的 XML 太容易了,而且我找不到一种方法来验证看起来不麻烦的 XML。理想情况下,我希望在 XmlSerializer 中设置架构或拥有一个验证的 XmlWriter。

【问题讨论】:

  • 在 .NET 4 中有一些事件可以捕获意外元素。

标签: c# validation schema serialization xmlserializer


【解决方案1】:

如何使用验证阅读器再次阅读它

这是一个快速的尝试

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

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

【讨论】:

    【解决方案2】:

    您可以使用XmlReader 根据 XSD 架构验证 XML 文件。

    【讨论】:

    • 是的,但这意味着我必须编写 XML,将其存储在某个地方,然后再次读取。我曾希望有一种更简单的方法可以即时完成。
    • XmlSerializer 不支持针对 XSD 模式进行验证,因为它应该从应该始终有效的对象生成 XML。
    • 但事实并非如此。如果它们的值为空,则似乎省略了必需的元素。 XmlSerializer 可能不支持其他一些东西(字符串的长度和模式约束、唯一性、键引用)。
    • 你不能将属性添加到你正在序列化的类的属性中以使其成为必需,那么相应的元素将被包含但没有值。例如,当反序列化这种事情时,会产生空值和空字符串之间的差异。
    • 像这样 [XmlElement (IsNullable = true)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多