C# 将xsd生成的代码中的属性多元化

C# 将xsd生成的代码中的属性多元化,c#,xml,xsd,xsd.exe,C#,Xml,Xsd,Xsd.exe,我有一个XSD,它描述了我正在构建的应用程序中一些数据契约的模式。我在编写xsd文件方面不是最有经验的,但到目前为止,我所做的任何尝试都无法解决我的问题 我的模式有一部分如下所示: <xs:complexType name="RecordSetDefinition"> <xs:sequence> <xs:element name="RecordId" type="RecordIdDefinition" minOccurs="0" maxOccurs="u

我有一个XSD,它描述了我正在构建的应用程序中一些数据契约的模式。我在编写xsd文件方面不是最有经验的,但到目前为止,我所做的任何尝试都无法解决我的问题

我的模式有一部分如下所示:

<xs:complexType name="RecordSetDefinition">
  <xs:sequence>
    <xs:element name="RecordId" type="RecordIdDefinition" minOccurs="0" maxOccurs="unbounded" />
    <xs:element name="Record" type="RecordDefinition" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
  <xs:attribute name="Id" type="xs:string" />
</xs:complexType>
产生:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="...")]
public partial class RecordSetDefinition {

    private RecordIdDefinition[] recordIdField;

    private RecordDefinition[] recordField;

    private string idField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("RecordId")]
    public RecordIdDefinition[] RecordId {
        get {
            return this.recordIdField;
        }
        set {
            this.recordIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Record")]
    public RecordDefinition[] Record {
        get {
            return this.recordField;
        }
        set {
            this.recordField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”、“2.0.50727.1432”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(命名空间=“…”)]
公共部分类记录集定义{
私有RecordIdDefinition[]recordIdField;
私有记录定义[]记录字段;
专用字符串字段;
/// 
[System.Xml.Serialization.XmlElementAttribute(“RecordId”)]
public RecordId定义[]RecordId{
得到{
返回此.recordIdField;
}
设置{
this.recordIdField=值;
}
}
/// 
[System.Xml.Serialization.XmlElementAttribute(“记录”)]
公共记录定义[]记录{
得到{
返回此.recordField;
}
设置{
this.recordField=值;
}
}
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串Id{
得到{
返回此.idField;
}
设置{
this.idField=值;
}
}
}
除了包含定义数组的属性的名称是单数而不是复数之外,这一切都很好

问题:

为了帮助理解代码,我希望将这些名称复数(即
RecordId
而不是
RecordId
)。这是否可以通过使用XSD来实现,以便
XSD.exe
在C#中生成复数数组名,同时仍保持单个元素名在XML中的单数

XML是任意的,可以更改,但到目前为止,我似乎还没有找到一种模式的排列方式来提供我想要的结果。我得到的最接近的结果是生成一个名为
RecordIds
的元素,它包含单个
RecordId
记录,但这仍然会导致一个相当不直观的
RecordIds.RecordId[]
属性。使用
xs:choice
将生成
RecordIds.Items[]
,这将有效,但我想知道是否有更好的方法


我不能只修改生成的代码,因为很明显,下次我们从
.xsd
生成
.cs
文件时,它会被覆盖,这会给下一个开发人员带来可维护性问题。

我不确定xsd.exe是否可以做到这一点

我认为最简单的解决办法是找到更好的名字。 怎么样
RecordIdList.RecordId[]

另一种方法是使用分部类。如果您可以找到一种方法,在部分类中获取
记录ID
,则可以在不更改它们的情况下重新生成其余代码

你也可以尝试使用。它没有自动生成复数名称的能力,但由于它是开源的,您可以更改它来为您实现这一点

另一个解决方案是在生成代码后对其进行转换。编写一个脚本,在生成
.cs
文件后修改该文件

我的选择是

  • 找个更好的名字
  • 保持原样,并可能在上的代码中添加注释 为什么名称是单数的,以便下一个开发人员知道发生了什么
  • xsd \c \l:cs
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="...")]
    public partial class RecordSetDefinition {
    
        private RecordIdDefinition[] recordIdField;
    
        private RecordDefinition[] recordField;
    
        private string idField;
    
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("RecordId")]
        public RecordIdDefinition[] RecordId {
            get {
                return this.recordIdField;
            }
            set {
                this.recordIdField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Record")]
        public RecordDefinition[] Record {
            get {
                return this.recordField;
            }
            set {
                this.recordField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string Id {
            get {
                return this.idField;
            }
            set {
                this.idField = value;
            }
        }
    }