svcutil没有生成类

时间:2015-02-18 20:29:48

标签: c# wcf xsd svcutil.exe

我有一个模式,我正在尝试编译成数据合同。我发现如果一个元素定义为<xs:element name="DogRequest" type="Dog"></xs:element>,则不会为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将为Dog with DogRequest生成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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您对WSDL的理解不正确。 DogRequest不是类型,这就是没有创建类的原因。模式<element>定义了一个xml元素,可以在XSD / WSDL的其他部分中使用它来引用Dog复杂类型。

例如,您的WSDL可能有一个类似于:

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

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

当XSD工具将XmlRootAttribute("DogRequest")添加到Dog类时,它定义<DogRequest>元素可能是xml消息的文档根,应该被序列化/反序列化为{ {1}}上课。

来自XmlRootAttribute

  

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