【发布时间】: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 文件时被覆盖,这会给下一个出现的开发人员带来可维护性问题。
【问题讨论】: