【问题标题】:svcutil not generating class for <element type="..."svcutil 没有为 <element type="..." 生成类
【发布时间】:2015-04-20 00:36:57
【问题描述】:

我有一个架构,我正在尝试将其编译为数据合约。我发现如果一个元素被定义为&lt;xs:element name="DogRequest" type="Dog"&gt;&lt;/xs:element&gt; 没有为 DogRequest 生成类。我想使用 svcutil 因为我要生成多个命名空间,而 xsd.exe 只允许一个。另外,我有一些使用相同类型的元素,而 xsd.exe 只生成其中一个。有谁知道是否有办法为这个模式生成类?

我正在使用一个接受 XML 有效负载的通用 Web 服务。我希望使用 WCF 来构建消息。

架构

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="Dog">
    <xs:sequence>
      <xs:element name="Name" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="DogRequest" type="Dog"></xs:element>
</xs:schema>

使用svcutil /dconly XMLSchema1.xsd编译

这将为 Dog 生成 1 个类,但不会为 DogRequest 生成一个类。

xsd.exe 将使用 DogRequest 为 Dog 生成 1 个类

svcutil 输出

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Dog", Namespace="http://tempuri.org/XMLSchema1.xsd")]
public partial class Dog : object, System.Runtime.Serialization.IExtensibleDataObject
{

    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    private string NameField;

    public System.Runtime.Serialization.ExtensionDataObject ExtensionData
    {
        get
        {
            return this.extensionDataField;
        }
        set
        {
            this.extensionDataField = value;
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, EmitDefaultValue=false)]
    public string Name
    {
        get
        {
            return this.NameField;
        }
        set
        {
            this.NameField = value;
        }
    }
}

XSD 输出

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/XMLSchema1.xsd")]
[System.Xml.Serialization.XmlRootAttribute("DogRequest", Namespace="http://tempuri.org/XMLSchema1.xsd", IsNullable=false)]
public partial class Dog {

    private string nameField;

    /// <remarks/>
    public string Name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

【问题讨论】:

    标签: c# wcf xsd svcutil.exe


    【解决方案1】:

    您对 WSDL 的理解不正确。 DogRequest 不是类型,这就是没有创建类的原因。架构&lt;element&gt; 定义了一个xml 元素,该元素可用于XSD/WSDL 的其他部分以引用Dog 复杂类型。

    例如,您的 WSDL 可能有一个部分,内容如下:

    <message name="DogMessage">
        <part name="parameter" element="tns:DogRequest"/>
    </message>
    

    tns 是您的目标命名空间。有关详细信息,请参阅Understanding WSDL 的类型部分。

    当 XSD 工具将 XmlRootAttribute("DogRequest") 添加到 Dog 类时,它定义了 &lt;DogRequest&gt; 元素可能是 xml 消息的文档根,并且应该序列化/反序列化到/从 Dog 类。

    来自XmlRootAttribute

    XmlRootAttribute 允许您控制 XmlSerializer 如何 通过设置某些属性来生成根元素。例如, 通过设置指定生成的 XML 元素的名称 ElementName 属性。

    【讨论】:

    • 我没有使用 WSDL,因为我正在使用通用方法获取 XML 有效负载的 Web 服务。我发现如果我将 type="..." 替换为 它确实会生成一个类。这有意义吗?
    • &lt;extension base=&gt; 定义了继承关系。它生成一个类是否有意义?是的。给你的问题:Dog 类继承自 DogRequest 是否有意义?另请注意:只有 XmlSerializer 将支持类继承(Data Contract Serializer 不支持)。
    • 为什么说Data Contract Serializer 不支持继承?我以前曾将它用于此目的,但没有任何问题。使用的模式是每个请求都有一个复杂的类型,如DogRequestType,以及一个DogRequest 元素以使其成为根。感谢您回答不可能,这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多