用于在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;
接下来,我们使用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非常大,由供应商提供。 同时更改生成的类也不是首选,因为重新生成文件时更改会丢失。
答案 0 :(得分:0)
你可以,应该吗?使用模式版本控制,以确保所有XML适合他们创建的模式,看看这个相关的问题。 What are the best practices for versioning XML schemas?