如何在使用XML(de)序列化时绕过枚举验证

时间:2017-05-05 11:35:03

标签: c# xml xsd xml-serialization

用于在C#中使用.NET System.Xml.Serialization处理XML。

起点是XSD,如:



<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <xsd:element name="Demo" type="DemoType"/>
  <xsd:complexType name="DemoType">
    <xsd:sequence>
      <xsd:element name="Some" type="SomeType" minOccurs="3" maxOccurs="6" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="SomeType">
    <xsd:sequence>
      <xsd:element name="enumValue" type="enumValueType"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="enumValueType">
    <xsd:attribute name="type" use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="Value_1"/>
          <xsd:enumeration value="Value_2"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>
  </xsd:complexType>
</xsd:schema>
&#13;
&#13;
&#13;

接下来,我们使用xsd.exe从XSD生成类,从而产生

namespace myNamespace {

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("Demo", Namespace="", IsNullable=false)]
public partial class DemoType {

    private SomeType[] someField;

    [System.Xml.Serialization.XmlElementAttribute("Some", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public SomeType[] Some {
        get {
            return this.someField;
        }
        set {
            this.someField = value;
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SomeType {

    private enumValueType enumValueField;

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public enumValueType enumValue {
        get {
            return this.enumValueField;
        }
        set {
            this.enumValueField = value;
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class enumValueType {

    private enumValueTypeType typeField;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public enumValueTypeType type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public enum enumValueTypeType {

    Value_1,

    Value_2,
}

}

不幸的是,事实证明传递给应用程序的XML并不总是格式良好。在定义的值旁边&#39; Value_1&#39;和&#39; Value_2&#39;我们还发现具有类型为&#39; Value_3&#39;的enumValue的情况。 因此,使用DemoType类(反)序列化XML失败。

有没有办法在不更改原始XSD的情况下序列化XML(de)? XSD非常大,由供应商提供。 同时更改生成的类也不是首选,因为重新生成文件时更改会丢失。

1 个答案:

答案 0 :(得分:0)

你可以,应该吗?使用模式版本控制,以确保所有XML适合他们创建的模式,看看这个相关的问题。 What are the best practices for versioning XML schemas?