如何形成有效的XSD,这有助于序列化为C#类

时间:2019-06-19 11:03:02

标签: c# serialization xsd

我已经开发了XSD,它定义了标准,并且有助于将两个应用程序一起通信。应用程序A和B。

应用程序A正确地从B读取xml数据。但是,当它尝试将相同的数据转换/序列化为xml时,会错误地进行序列化。

XML示例为:(希望如此)

   <Field>
      <FieldId>1</FieldId>
       <FieldType>  
          <FieldTypeString>John</FieldTypeString>
       </FieldType>
    <\Field>
or
    <Field>
      <FieldId>2</FieldId>
      <FieldType>  
        <FieldTypeInteger>30</FieldTypeString>
      </FieldType>
    <\Field>

 or   
    <Field>
      <FieldId>3</FieldId>
      <FieldType>  
        <FieldTypeDate>19/06/2019</FieldTypeString>
      </FieldType>
    <\Field>

等效的XSD为: enter image description here

等效的C#类为:

public partial class FieldGroupFieldColumnFieldFieldType
{

    private object itemField;

    private ItemChoiceType itemElementNameField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeCheckedUnChecked", typeof(bool))]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeDate", typeof(System.DateTime), DataType = "date")]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeFloat", typeof(decimal))]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeInteger", typeof(string), DataType = "integer")]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeString", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeTime", typeof(System.DateTime), DataType = "time")]
    [System.Xml.Serialization.XmlElementAttribute("FieldTypeYESNO", typeof(bool))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
    public object Item
    {
        get
        {
            return this.itemField;
        }
        set
        {
            this.itemField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemChoiceType ItemElementName
    {
        get
        {
            return this.itemElementNameField;
        }
        set
        {
            this.itemElementNameField = value;
        }
    }
}

应用程序A完美地解析了B的xml。但是,当它自己生成XML时,它看起来像。

<Field>
      <FieldId>1</FieldId>
       <FieldType>  
          <Item>John</FieldTypeString>
          <ItemElementName>2</ItemElementName>
       </FieldType>
<\Field>

我认为XSD / class属性需要修改!

任何对此的建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

使用xsd.exe将xsd转换为C#,不要手工。

此外,为了便于阅读,您应该隔离复杂的类型。当元素包含复杂类型时,请将其声明为XSD根目录下而不是元素内部的命名类型。

然后在声明元素时,用xs:type="tns:complextypename"引用复杂类型

编辑:简单类型也是如此。