[英]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允許您通過設置某些屬性來控制XmlSerializer如何生成根元素。 例如,通過設置ElementName屬性來指定生成的XML元素的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.