从 xsd 生成的代码中的复数属性

Posted

技术标签:

【中文标题】从 xsd 生成的代码中的复数属性【英文标题】:Pluralizing properties in generated code from xsd 【发布时间】:2015-06-19 09:48:49 【问题描述】:

我有一个 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>

这对应的 XML 如下所示:

<RecordSet Id="Test">
  <RecordId ...>
    ...
  </RecordId>
  <RecordId ...>
    ...
  </RecordId>
  <Record ...>
    ...
  </Record>
  <Record ...>
    ...
  </Record>
  <Record ...>
    ...
  </Record>
</RecordSet>

我的想法是我的RecordSetDefinition 数据合约有一个RecordIdDefinitions 和RecordDefinitions 数组。运行生成命令:

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;
        
    

这一切都很好而且很花哨...除了包含定义数组的属性名称是单数,而不是复数。

问题:

为了帮助理解代码,我希望这些名称采用复数形式(即 RecordIds 而不是 RecordId)。是否可以使用 XSD 来做到这一点,以便 xsd.exe 将在 C# 中生成复数数组名称,同时仍保持 XML 中的单个元素名称?

XML 是任意的并且可以更改,但到目前为止,我似乎无法找到能够提供我想要的结果的架构排列。我得到的最接近的是创建一个名为 RecordIds 的元素,其中包含单独的 RecordId 记录,但这仍然会导致相当不直观的 RecordIds.RecordId[] 属性。使用xs:choice 会生成RecordIds.Items[],这会起作用,但我想知道是否有更好的方法。

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

【问题讨论】:

【参考方案1】:

我不确定 xsd.exe 是否可行

我认为最简单的解决方案是找到更好的名称。 RecordIdList.RecordId[]呢?

另一种方法是使用部分类。如果您能找到一种方法将您的RecordIds 放入部分类中,您可以重新生成其余代码而无需更改它们。

您也可以尝试使用xsd2code。它没有自动生成复数名称的能力,但由于它是开源的,您可以更改它来为您执行此操作。

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

我的选择是。

    找到一个更好的名字 保持原样,并可能在代码中添加注释 为什么名称是单数的,以便下一个开发人员知道发生了什么。

【讨论】:

以上是关于从 xsd 生成的代码中的复数属性的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 XSD 中定义为属性时,自动生成的类中的字段会序列化为元素?

xsd生成的Java代码中的布尔值

从 Visual Studio 中的类生成 XSD

向依赖于XSD中的信息的JAXB生成的类添加注释

难以对齐 JSONschema 和 XSD 等效项

VB中使用XSD生成的类读取XML示例