У меня есть схема, которую я пытаюсь скомпилировать в контракты с данными. Я обнаружил, что если элемент определен как <xs:element name="DogRequest" type="Dog"></xs:element>
, для DogRequest не создается класс. Я хотел бы использовать svcutil, поскольку у меня есть несколько пространств имен для генерации, и xsd.exe разрешает только один. Плюс у меня есть несколько элементов, использующих один и тот же тип, а xsd.exe генерирует только один из них. Кто-нибудь знает, есть ли способ генерировать классы для этой схемы?svcutil не генерирует класс для <element type = "..."
Я использую общий веб-сервис, который принимает полезную нагрузку XML. Я надеюсь использовать 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
это будет генерировать 1 класс для собаки, но ничего для DogRequest.
xsd.exe будет генерировать 1 класс для собаки с DogRequest
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, поскольку веб-сервис, с которым я сталкиваюсь, использует общий метод для получения полезной нагрузки XML. Я нашел, если я заменил type = "..." на, он генерирует класс. Имеет ли это смысл? –
Iain
'' определяет отношение наследования. Имеет ли смысл, что он создает класс? Да. Вопрос для вас: Имеет ли смысл, что класс 'Dog' наследуется от' DogRequest'? Также следует предупредить: только XmlSerializer будет поддерживать наследование класса (Serializer Data Contract не работает). –
ErnieL
Почему вы говорите, что Serializer Data Contract не поддерживает наследование?Я использовал его для этой цели раньше, и у меня не было никаких проблем. Используемый шаблон представляет собой каждый запрос с таким сложным типом, как 'DogRequestType' и элемент' DogRequest', чтобы сделать его корневым. Спасибо за ответ, что это невозможно, это было полезно. – Iain