C# 将xsd生成的代码中的属性多元化
我有一个XSD,它描述了我正在构建的应用程序中一些数据契约的模式。我在编写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
<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;
}
}
}