从XSD架构生成C#代码时,如何让数组的名称不是"Items"?

Gra*_*ank 4 .net attributes xsd code-generation web-services

我正在开发一个项目,该项目必须连接到一些古老的Web服务,这些Web服务将请求和响应的一些分层数据打包成单个分层XML字符串.

我一直在使用xsd.exe从示例请求和响应XML片段生成XSD,在必要时修改它们以获得最佳定义,并再次使用xsd.exe生成C#对象.然后,调用web服务的管理器可以将这些强类型请求对象作为参数,将它们序列化为字符串以进行调用,将响应作为字符串返回,将它们反序列化为强类型响应对象并返回它们.

如果我有一个字符串列表,我可以有一个有效的XSD,它认为它是一个复杂类型的无界xs:选择xs:string元素,然后它会反序列化为一个字符串数组,这很好,处理起来很简单.令人烦恼的问题是,由于某种原因,似乎没有任何方法可以让它调用除" Items " 之外的任何字符串数组.无论什么我添加到架构,我不能让XSD.EXE写任何其他名称.

这是一个示例XSD架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs">
                <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

由此产生的课程:

public partial class AccountStatusRequest {

    private string[] itemsField;

    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
    public string[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试将intellisense中的每个msdata:属性添加到选择和内部元素中,没有任何区别.

仅仅为了论证,我为该complexType添加了一些额外的类似选择,看看是否会强制它使用字符串数组的名称,而是它给了我Items,Items1,Items2 ......

我真的不希望它必须是一个只拥有字符串的自己类型的数组,但我也真的不想留下它叫做" Items ",没有xml注释(有没有人知道如何添加THOSE到一个xsd?),它应该有一个更具描述性的名称.我绝对不能只是手动将其更改为Web服务模式更改时所需的工作流程,即更改XSD然后从中重新生成类.

这似乎是xsd.exe应该支持的另一个东西.有什么我想念的吗?我应该以某种方式采取不同的方法吗?或者是否有一种替代工具可以用于此而不是跛脚?

小智 7

尝试将选项更改为序列,并将最小值/最大值出现在AccountRowID元素中...


Rob*_*obS -1

编辑:抱歉,我错过了之前的答案 - 它对我有用 - 这是我使用的模式和结果。我原来的答案可能也合适。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs">
              <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>  
</xs:schema>

public partial class AccountStatusRequest {

    private string[] accountRowIDField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
    public string[] AccountRowID {
        get {
            return this.accountRowIDField;
        }
        set {
            this.accountRowIDField = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您好,我对架构进行了一些更改,用 simpleType 和属性包装的列表替换了选择,这产生了所需的输出(一个命名字符串数组)。但是,我不确定更改后的架构是否适合您正在做的事情?

这是修改后的架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList">
        <xs:complexType>
          <xs:attribute name="AccountRowIDs">
            <xs:simpleType id="AccountRowID"  >
              <xs:list itemType="xs:string">                
              </xs:list>
            </xs:simpleType>       
          </xs:attribute>
        </xs:complexType>
    </xs:element>  
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

..以及使用 xsd.exe 运行后的输出:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class AccountStatusRequest {

    private string[] accountRowIDsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string[] AccountRowIDs {
        get {
            return this.accountRowIDsField;
        }
        set {
            this.accountRowIDsField = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)