从xsd中生成的代码中的多个属性

时间:2015-04-13 22:39:25

标签: c# xml xsd xsd.exe

我有一个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的数据合同包含RecordIdDefinitionRecordDefinition的数组。运行generate命令:

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[]这会有效,但我想知道是否有更好的方法。

我无法修改生成的代码,因为很明显,下次我们从.cs生成.xsd文件时会覆盖这些代码,这会给下一位开发人员带来可维护性问题沿。

1 个答案:

答案 0 :(得分:0)

我不确定xsd.exe

是否可行

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

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

您也可以尝试使用xsd2code。它无法自动生成多个名称,但由于它是开源的,您可以更改它以便为您执行此操作。

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

我的选择是。

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