代码之家  ›  专栏  ›  技术社区  ›  Grank

从XSD模式生成C#代码时,如何使数组具有“Items”以外的名称?

  •  4
  • Grank  · 技术社区  · 17 年前

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

    比如说,如果我有一个字符串列表,我可以有一个有效的XSD,它认为它是一个复杂类型的无界xs:choice of xs:string元素,然后它将简单地反序列化为一个字符串数组,这很好,也很容易处理。恼人的问题是,出于某种原因,似乎没有任何方法可以让它调用字符串数组,而不是“ 项目 ”“没关系 什么

    下面是一个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>
    

    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;
            }
        }
    }
    

    我已经尝试将几乎所有的msdata:intellisense属性都添加到choice和内部元素中,但没有任何区别。

    为了便于讨论,我在complexType中添加了两个额外的类似选项,以查看这是否会迫使它为字符串数组使用名称,但它给了我一个名称 项目1 项目2 ...

    我真的不希望它必须是一个自己类型的数组,只能保存一个字符串,但我也真的不想让它保持调用状态” 项目 “,没有xml注释(有人知道如何将这些注释添加到xsd吗?),而它应该有一个更具描述性的名称。而且我绝对不能在Web服务架构更改时手动更改它,因为所需的工作流是更改xsd,然后从中重新生成类。

    这似乎是xsd.exe应该支持的另一个功能。有什么我遗漏的吗?我应该采取不同的方法吗?或者有没有一种替代的工具,我可以用它来代替,不那么蹩脚?

    3 回复  |  直到 17 年前
        1
  •  7
  •   paquetp paquetp    17 年前

        2
  •  0
  •   Marc Gravell    17 年前

        3
  •  -1
  •   RobS    17 年前

    编辑:很抱歉,我不知怎么错过了前面的答案——它对我很有效——这是我使用的模式和结果。我最初的答案也可能是合适的。

    <?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;
            }
        }
    }
    

    您好,在这里,我稍微更改了模式,用一个由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>
    

    ..以及使用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;
            }
        }
    }
    
    推荐文章