【问题标题】:How to do an XML Serialization with force creating all obligatory elements如何通过强制创建所有强制性元素来进行 XML 序列化
【发布时间】:2011-08-08 12:58:42
【问题描述】:

我已经使用 xsd 工具从一些 xml 方案生成了一个 cs 类。 该方案是从 uml 类描述生成的非常复杂的方案。 现在我编写了一个简单的测试来确保生成的 xsd 类的功能。 测试使用XmlSerializer 创建 xml 文件。

在我的 XSD 方案中,有一些强制性元素(通过 xsd-default 定义为 minocc=1maxocc=1)。

例如(简体):

<xs:element name="order">
    <xs:complexType>
       ...
         <xs:element name="orderId" type="string"/>
         <xs:element name="material" type="Material"/>
       ...
    <xs:complexType>

Material 是一个复杂的类型,它由几个元素组成。这是秩序的一部分。

这些元素应该始终存在于生成的 xml 文件中,即使它们是空的或仅包含空元素。现在,如果我将类实例序列化为 xml 文件,则只有元素出现在类属性包含值的位置。如果我设置 orderId,则会出现 orderId-element,但不会出现 material-element,因为在我的类实例中它为空。因此,我的 xml 文件对 xsd 架构无效。

您知道如何在序列化过程中使用我的 xsd 文件验证生成的 xml 文件吗?有没有办法告诉XmlSerializer 它应该始终生成强制性元素(可能带有默认值)? 或者有没有办法验证应该序列化的类实例的结构?

【问题讨论】:

  • 您总是可以提供非null 值吗?
  • 我遇到的问题是,xsd-schema 和生成的类结构非常复杂,我不想设置所有不需要的属性。
  • 但 xsd 肯定会告诉你他们需要...
  • 是的,没错,但即使我从我的 xsd 文件创建了 c# 类,序列化也不符合它
  • IIRC XmlReader 和 XmlWriter 都支持针对 xsd 的验证

标签: c# xml serialization xsd xmlserializer


【解决方案1】:

您无法自动生成元素来满足您所需的规则。 在第二个问题上,您可以使用 XmlReader 和 XmlSchema 对象验证生成的 xml。 一个小例子如下所示:

        public IList<string> Validate(TextReader reader, XmlSchema schema)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(schema);
            settings.ValidationType = ValidationType.Schema;

            List<string> errors = new List<string>();

            settings.ValidationEventHandler += (sender, e) =>
            {
                errors.Add(string.Format("Line {0} at position {1}{2}{3}",
                        e.Exception.LineNumber, e.Exception.LinePosition,
                                    Environment.NewLine, e.Message));
            };


            XmlReader xmlReader = XmlReader.Create(reader, settings);
            while (xmlReader.Read()) { };

            return errors;
        } 

本示例采用一个 TextReader(可以是 StreamReader、StringReader 等)和一个 XmlSchema 对象(您可以从 xsd 文件或其他任何内容构造一个 - 检查它的文档)并返回验证错误列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多