2015-02-18 2 views
0

У меня есть схема, которую я пытаюсь скомпилировать в контракты с данными. Я обнаружил, что если элемент определен как <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; 
     } 
    } 
} 

ответ

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 и должен быть сериализованными/десериализацией в/из Dog класса.

От XmlRootAttribute:

XmlRootAttribute позволяет контролировать, как XmlSerializer создает корневой элемент, установив определенные свойства. Например, указать имя сгенерированного элемента XML, установив свойство ElementName .

+0

Я не использую WSDL, поскольку веб-сервис, с которым я сталкиваюсь, использует общий метод для получения полезной нагрузки XML. Я нашел, если я заменил type = "..." на , он генерирует класс. Имеет ли это смысл? – Iain

+0

'' определяет отношение наследования. Имеет ли смысл, что он создает класс? Да. Вопрос для вас: Имеет ли смысл, что класс 'Dog' наследуется от' DogRequest'? Также следует предупредить: только XmlSerializer будет поддерживать наследование класса (Serializer Data Contract не работает). – ErnieL

+0

Почему вы говорите, что Serializer Data Contract не поддерживает наследование?Я использовал его для этой цели раньше, и у меня не было никаких проблем. Используемый шаблон представляет собой каждый запрос с таким сложным типом, как 'DogRequestType' и элемент' DogRequest', чтобы сделать его корневым. Спасибо за ответ, что это невозможно, это было полезно. – Iain

Смежные вопросы