我有一个模式,我正在尝试编译成数据合同。我发现如果一个元素定义为<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;
}
}
}
答案 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允许您控制XmlSerializer的方式 通过设置某些属性来生成根元素。例如, 通过设置指定生成的XML元素的名称 ElementName属性。