簡體   English   中英

svcutil不為生成類

[英]svcutil not generating class for <element type=“…”

我有一個試圖將其編譯成數據契約的模式。 我發現是否將元素定義為<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將使用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;
        }
    }
}

您對WSDL的理解不正確。 DogRequest不是類型,這就是為什么不創建任何類的原因。 模式<element>定義了一個XML元素,可以在XSD / WSDL的其他部分中使用該元素來引用Dog復雜類型。

例如,您的WSDL可能有一個部分,內容如下:

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

其中tns是您的目標名稱空間。 有關更多詳細信息,請參見了解WSDL的“類型”部分。

當XSD工具將XmlRootAttribute("DogRequest")到Dog類時,它定義<DogRequest>元素可能是xml消息的文檔根,並且應該與Dog類進行序列化/反序列化。

XmlRootAttribute

XmlRootAttribute允許您通過設置某些屬性來控制XmlSerializer如何生成根元素。 例如,通過設置ElementName屬性來指定生成的XML元素的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM