Поддержка привязки элемента ComplexType

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Платформа .NET Framework обеспечивает поддержку привязки для элемента <complexType>.

Программа Xsd.exe приравнивает сложные типы схем XML к типам .NET Framework, открытые поля или свойства которых представляют содержимое этих сложных типов.

Объяснение

Программа Xsd.exe приравнивает сложные типы схем XML к типам .NET Framework, открытые поля которых представляют содержимое этих сложных типов.

Атрибут Abstract

Сложный тип объявляется абстрактным (abstract="true"), чтобы в совместимых документах XML использовались только экземпляры производных типов, а не абстрактного базового типа.

Программа Xsd.exe приравнивает абстрактный сложный тип к абстрактному классу. Преобразование действует в обоих направлениях между кодом и документами.

Несмотря на использование ключевого слова abstract (абстрактный), абстрактный класс обрабатывается так же, как неабстрактный базовый класс. Дочерние классы расширяют базовый класс. Программа Xsd.exe применяет к абстрактному классу по одному атрибуту System.Xml.Serialization.XmlIncludeAttribute за каждый класс-потомок. Каждый атрибут XmlInclude указывает тип класса-потомка.

Пример: атрибут Abstract

В следующем примере кода показано использование атрибута abstract с элементом <complexType>.

Входной документ схемы XML:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="FamilyNode" type="FamilyNodeType" />
  <xsd:complexType name="FamilyNodeType">
    <xsd:sequence>
      <xsd:element name="Code" type="xsd:string" />
      <xsd:element name="Parent" type="Parent" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Daughter">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Date" type="xsd:dateTime" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Son">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Info" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Parent" abstract="true">
    <xsd:sequence>
      <xsd:element name="Text" type="xsd:normalizedString" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Grandchild">
    <xsd:complexContent>
      <xsd:extension base="Daughter">
        <xsd:attribute name="Parent" type="xsd:normalizedString" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

Классы C#, созданные на основе приведенного выше документа схемы XML:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyNode", Namespace="http://example.org/", IsNullable=false)]
public class FamilyNodeType {
        
    public string Code;
        
    public Parent Parent;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Son))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Daughter))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public abstract class Parent {
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Son : Parent {        
    public string Info;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public class Daughter : Parent {
        
    public System.DateTime Date;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool DateSpecified;
}
    
 [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Grandchild : Daughter {        
    [System.Xml.Serialization.XmlAttributeAttribute("Parent", DataType="normalizedString")]
    public string Parent1;
}

Схема XML, созданная из классов, скомпилированных из приведенного выше кода C#, фактически эквивалентна исходной схеме XML.

Возможные атрибуты Поддержка привязки

abstract

Программа Xsd.exe приравнивает абстрактный сложный тип, имеющий атрибут abstract="true", к абстрактному классу. За каждый класс, наследующий от абстрактного класса, программа Xsd.exe применяет к абстрактному классу атрибут System.Xml.Serialization.XmlIncludeAttribute, указывающий тип класса-потомка.

См. предыдущий раздел: Abstract Attribute.

block

Атрибут block можно применить к типу данных, чтобы производные типы не могли занять место исходного типа, если исходный указан.

Программа Xsd.exe игнорирует атрибут block, а также атрибут blockDefault элемента Поддержка привязки элемента Schema.

final

Атрибут final можно применить к типу данных, чтобы запретить его наследование.

Программа Xsd.exe не обрабатывает атрибут final, а также атрибут finalDefault элемента <schema>.

id

Программа Xsd.exe пропускает атрибут id, который предназначен для обеспечения уникального идентификатора. Вместо него она использует атрибут name.

mixed

См. описание атрибута mixed.

name

Значение атрибута name становится именем типа .NET Framework, который программа Xsd.exe создает из сложного типа.

Регистр символов не изменяется для соответствия соглашениям о написании кода. Например, если атрибут name элемента <complexType> имеет значение testInfo, то результирующий класс получает имя testInfo, а не TestInfo (с заглавной буквы). Если имя совпадает с зарезервированным ключевым словом, в начало имени добавляется символ @.

Когда программа Xsd.exe создает определение <complexType> из класса, она использует имя этого класса в качестве значения атрибута name. Альтернативное имя (значение атрибута name) можно указать с помощью свойства TypeName.

См. описание атрибута Поддержка привязки атрибута Name.

Возможные родительские элементы: <element>, <redefine>, <schema>

Возможные дочерние элементы: <all>, <annotation>, <anyAttribute>, <attribute>, <attributeGroup>, <choice>, <complexContent>, <group>, <sequence>, <simpleContent>

См. также

Справочник

XmlSchemaComplexType