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

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

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

Объяснение

Спецификация схемы XML указывает, что элемент может быть объявлен локально в рамках определения сложного типа или глобально в качестве дочернего элемента корневого элемента <schema>. Если элемент объявлен глобально, ссылка на него возможна из одного или нескольких определений сложных типов при помощи атрибута ref.

В следующем примере кода показано локальное объявление элемента.

<xsd:complexType name="UnitType">
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string"/>
  </xsd:sequence>
</xsd:complexType>

В следующем примере кода этот же элемент объявляется глобально, а затем на него создается ссылка.

<xsd:element name="name" type="xsd:string"/>
<xsd:complexType name="UnitType">
  <xsd:sequence>
    <xsd:element ref="name"/>
  </xsd:sequence>
</xsd:complexType>

При формировании типа платформы .NET Framework из сложного типа схемы XML программа Xsd.exe не делает различия между локально объявленным элементом и ссылкой на глобально объявленный элемент, если только глобальный элемент не объявлен в пространстве имен, отличном от целевого пространства имен схемы.

Ссылка в рамках одного пространства имен

Так как программа Xsd.exe не делает различия в рамках одного пространства имен, при последовательных прямом и обратном преобразованиях из схемы XML в классы и обратно создаются локальные элементы, заменяющие все ссылки на глобальные элементы.

Если для типа данных глобального элемента, на который имеется ссылка, уже имеется автоматическая привязка к типу .NET Framework, программа Xsd.exe не создает новый тип, соответствующий этому типу данных. В результате в схеме XML, созданной при последовательных прямом и обратном преобразованиях, не только отсутствуют ссылки на объявление глобального элемента, но и отсутствует само это объявление.

awac9czf.note(ru-ru,VS.100).gifПримечание
Для всех встроенных типов данных схемы XML имеются автоматические привязки к типам платформы .NET Framework. Кроме того, определенные схемой простые типы, за одним исключением, привязываются к типам платформы .NET Framework, а не к настраиваемым типам. Единственным исключением является перечисление типов, привязываемых к строке. Более подробно это исключение рассматривается в документации по элементу <enumeration>.

awac9czf.note(ru-ru,VS.100).gifПримечание
Дополнительные сведения о поддержке простых типов, определенных в схеме, см. в описании элемента <restriction> или любых элементов, представляющих аспекты ограничений.

Ссылка на другое пространство имен

Если глобальное объявление, на которое существует ссылка, принадлежит другому пространству имен, программа Xsd.exe задает пространство имен при помощи свойства Namespace атрибута XmlElementAttribute, примененного к созданному полю. Для этого элемента пространство имен, указанное в свойстве Namespace, переопределяет пространство имен, указанное на уровне класса с помощью атрибута XmlTypeAttribute и (необязательно) атрибута XmlRootAttribute, как показано в следующем примере.

[System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem")]
public string Text;

Дополнительные пространства имен импортируются в определение схемы XML при помощи элемента <import>.

Создание глобальных объявлений элементов

При создании документа схемы XML из набора классов в сборке программа Xsd.exe создает глобальное объявление <element> для каждого определения <complexType> или <simpleType>, создаваемого программой из типа, определенного в сборке.

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

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="Text" type="xsd:normalizedString"/>
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

Документ схемы XML, созданный из сборки, скомпилированной на основе предыдущего исходного кода C#.

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" name="Text" type="xs:normalizedString" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

В приведенной выше созданной схеме XML элемент Text, изначально объявленный глобально, стал локальным элементом.

Второй пример показывает, как программа Xsd.exe обрабатывает ссылку на глобальный элемент, заданный в другом пространстве имен. В этом примере используется элемент <import> для импорта второго пространства имен из другого XSD-файла. (Атрибут schemaLocation элемента <import> не используется для задания расположения импортируемого XSD-файла. Вместо этого расположение файла задается для программы Xsd.exe дополнительным параметром командной строки.)

Входной документ схемы XML верхнего уровня.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
      xmlns="http://example.org/" targetNamespace="http://example.org/" xmlns:elem="http://example.org/elem">
  <xsd:import  namespace="http://example.org/elem" />
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="elem:Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

Импортированный входной документ схемы XML.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
      xmlns="http://example.org/elem" targetNamespace="http://example.org/elem">
  <xsd:element name="Text" type="xsd:normalizedString"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem", DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

Документ схемы XML верхнего уровня, созданный из сборки, скомпилированной на основе предыдущего исходного кода C#.

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://example.org/elem" />
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" xmlns:q1="http://example.org/elem" ref="q1:Text" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

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

<xs:schema xmlns:tns="http://example.org/elem" elementFormDefault="qualified" targetNamespace="http://example.org/elem" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Text" type="xs:normalizedString" />
</xs:schema>

Атрибут Abstract

Объявление глобального элемента может иметь атрибут abstract, а локальный элемент не может иметь этот атрибут.

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

Глобальный элемент, заменяемый подстановкой, называется головным элементом. Когда объявление локального элемента ссылается на головной элемент с помощью атрибута ref, вместо него можно использовать любые глобальные подстановочные элементы. Дополнительные сведения см. в разделе см. в описании атрибута substitutionGroup.

Если подстановочные элементы относятся к производным типам данных и абстрактным объявлен сам головной элемент (а не определение <complexType> для его типа), то базовый тип можно использовать в любом месте XML-документа экземпляра, хотя его нельзя использовать в позиции, где производится подстановка.

При создании исходного кода из документа схемы XML программа Xsd.exe создает тип, соответствующий типу данных головного элемента. Этот тип содержит поле с именем Item. Программа Xsd.exe применяет к этому полю по одному атрибуту XmlElementAttribute для каждой из подстановок. Каждый атрибут задает имя и, если подстановочный элемент имеет производный тип данных, этот тип. Если подстановочные элементы используют те же типы данных, что и головной элемент, то также необходимо применять атрибут XmlChoiceIdentifierAttribute. Дополнительные сведения см. в разделе см. в описании элемента <choice>.

В следующем примере кода показан образец поля Item, созданного из ссылки на абстрактный головной элемент.

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

Если используются подстановочные элементы, относящиеся к производным типам данных, XML-сериализация работает только в том случае, когда этому полю присвоен экземпляр одного из этих производных типов. Класс XmlSerializer завершается с ошибкой, если присвоен экземпляр базового типа, соответствующего головному элементу.

При обратном преобразовании программа Xsd.exe создает элемент <choice>, содержащий элемент <element> для каждого подстановочного элемента и не содержащий элемент <element> для головного элемента. Элементы независимо определены в определении сложного типа; ссылки ref не используются.

awac9czf.note(ru-ru,VS.100).gifПримечание
В объявлении локального элемента <element>, содержащем атрибут ref, который задает абстрактный головной элемент, программа Xsd.exe не обрабатывает атрибут maxOccurs.

awac9czf.note(ru-ru,VS.100).gifПримечание
Рассмотрим следующее объявления головного элемента типа MyBaseType.

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />
awac9czf.note(ru-ru,VS.100).gifПримечание
Для предыдущего объявления программа Xsd.exe по-прежнему создает следующее поле (атрибуты не указаны).

public MyBaseType Item;
awac9czf.note(ru-ru,VS.100).gifПримечание
Программа Xsd.exe не может создать классы, если все глобально объявленные элементы во входной схеме XML являются абстрактными.

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

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

Документ схемы XML, созданный из сборки, скомпилированной на основе предыдущего исходного кода C#.

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Field1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="Field2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DerivedTypeA">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForA" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DerivedTypeB">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema> 

Атрибут substitutionGroup

Инструмент Xsd.exe распознает группы подстановки, только если заменяемый элемент объявлен как абстрактный. (См. предыдущий раздел: Abstract Attribute.) Затем при обратном преобразовании программа Xsd.exe создает элемент <choice>, содержащий элемент <element> для каждого подстановочного элемента.

Атрибут substitutionGroup: общие сведения

Атрибут substitutionGroup может появляться только с глобально объявленным элементом, позволяя ему замещать другой глобально объявленный элемент в XML-документе экземпляра. Значением атрибута является имя заменяемого элемента, называемого головным элементом. Фактическая подстановка может выполняться в элементе <element> в определении сложного типа, в котором задана ссылка на головной элемент с помощью атрибута ref. Любые элементы, объявленные в атрибуте substitutionGroup, должны принадлежать к тому же типу данных, что и головной элемент, или к производному типу.

Группа подстановки используется для того, чтобы разрешить элементам с другими именами и, возможно, с другими типами (но с тем же базовым типом) появляться в указанной позиции в документе экземпляра.

Вложенные группы подстановки не поддерживаются. То есть, если элемент является головным элементов в одной группе подстановки, он не может быть подставляемым элементом в другой группе подстановки. Например:

<xs:element name="Animal" abstract="true"/>
<xs:element name="Mammal" abstract="true" 
    substitutionGroup="tns:Animal"/>
<xs:element name="Dog" type="xs:string" 
    substitutionGroup="tns:Mammal"/>

Это не поддерживается, так как “Mammal» является как головным элементом (для «Dog»), так и подставляемым элементом (для «Animal»). Если встречается такая схема, программа Xsd.exe не создает атрибут XmlElementAttribute для элемента Mammal, а элемент Dog не появится там, где ожидается элемент Animal. Однако можно сделать этот вариант работоспособным, если вручную добавить код, показанный в следующем примере.

public class PetShop 
{
    private object Animal;
    
    // Apply the XmlElementAttribute to the generated property.
    [System.Xml.Serialization.XmlElementAttribute("Mammal"), 
     System.Xml.Serialization.XmlElementAttribute("Dog")]
    public object Animal {
        get {
            return this.Animal;
        }
        set {
            this.Animal = value;
        }
    }
}

Атрибут SubstitutionGroup: конкретный головной элемент

Если головной элемент не является абстрактным, программа Xsd.exe берет каждую ссылку ref на головной элемент и создает поле, тип которого соответствует типу XML-данных головного элемента (или массив этого типа, в зависимости от значения атрибута maxOccurs ссылающегося элемента). Любые ссылки на группу подстановки теряются.

Хотя такому полю можно присвоить объект производного типа и класс XmlSerializer сериализует такой объект, это выполняется вне подстановки с производными типами. Имя подстановочного элемента не используется.

Атрибут SubstitutionGroup: абстрактный головной элемент

Если головной элемент является абстрактным, программа Xsd.exe создает поле с типом, соответствующим типу данных головного элемента. Полю присваивается имя Item. Программа Xsd.exe применяет к этому полю по одному атрибуту XmlElementAttribute для каждой из подстановок. Каждый атрибут задает имя и, если подстановочный элемент имеет производный тип данных, этот тип. Если подстановочные элементы используют тот же тип данных, что и головной элемент, должен также быть применен атрибут XmlChoiceIdentifierAttribute. См. описание элемента <choice>.

Далее приведен образец поля, созданного из ссылки на абстрактный головной элемент.

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

Если используются производные типы, то XML-сериализация работает только в случае, когда полю присвоен экземпляр одного из производных типов. XmlSerializer завершает работу с ошибкой, если присваивается экземпляр базового типа, соответствующего головному элементу.

При обратном преобразовании программа Xsd.exe создает из этой конструкции элемент <choice>, содержащий элемент <element> для каждого подстановочного элемента, но не для головного элемента. Элементы независимо определены в определении сложного типа; ссылки ref не используются.

maxOccurs attribute. Для объявления локального элемента <element>, содержащего атрибут ref, который задает абстрактный головной элемент, программа Xsd.exe не обрабатывает атрибут maxOccurs.

Рассмотрим следующее объявление, которое ссылается на головной элемент типа MyBaseType.

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />

Для предыдущего объявления программа Xsd.exe по-прежнему создает следующее поле (атрибуты не указаны).

public MyBaseType Item;

Пример. Атрибут substitutionGroup

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

Документ схемы XML, созданный из сборки, скомпилированной на основе предыдущего исходного кода C#.

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Field1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="Field2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DerivedTypeA">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForA" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DerivedTypeB">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

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

abstract

Программа Xsd.exe выполняет привязку групп подстановки с использованием объявлений абстрактных элементов <element>, но при обратном преобразовании создает элементы <choice>.

См. предыдущий раздел: «Атрибут Abstract».

block

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

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

default

Атрибут default предоставляет значение по умолчанию, которое используется, если элемент в документе экземпляра пуст. Если элемент вообще не указан, он не заполняется.

При создании исходного кода из документа схемы XML программа Xsd.exe к каждому полю, соответствующему элементу со значением по умолчанию, применяет атрибут System.ComponentModel.DefaultValueAttribute, передавая значение по умолчанию как аргумент. Кроме того, программа Xsd.exe статически инициализирует поле значением по умолчанию, как в следующем примере.

[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;

При создании элемента <element> из члена класса, имеющего тип значения .NET Framework, программа Xsd.exe использует атрибут DefaultValue в качестве входных данных для задания атрибута minOccurs. Если программа Xsd.exe встречает атрибут DefaultValue, примененный к такому члену, создается значение 0 для атрибута minOccurs этого элемента. Это означает, что данный элемент не должен появляться в допустимом документе экземпляра XML.

Атрибут default не учитывается для массивов (элементов, у которых значение атрибута maxOccurs превышает 1).

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

final

Атрибут final может использоваться для предотвращения использования объявлений элементов в качестве головных элементов групп подстановки (элементов, вместо которых подставляются члены групп).

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

fixed

Атрибут неизменности предоставляет фиксированное значение, которое используется для элемента в документе экземпляра. При создании исходного кода из документа схемы XML программа Xsd.exe берет каждое поле, соответствующее элементу с фиксированным значением, и создает для этого поля статический инициализатор, как в приведенном ниже примере.

public int age = -1;

Атрибут неизменности не учитывается для массивов (элементов, у которых значение maxOccurs превышает 1).

form

Программа Xsd.exe считает XML-атрибут form элемента <element> равным свойству Form атрибута XmlElementAttribute. Инфраструктура XML-сериализации платформы .NET Framework распознает другое значение по умолчанию: qualified.

Если в объявлении <element> в схеме XML указано значение form="unqualified", программа Xsd.exe создает атрибут XmlElement для соответствующего поля и передает в атрибут параметр Form=XmlSchemaForm.Unqualified.

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

id

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

maxOccurs

При создании классов из XSD-документа программа Xsd.exe интерпретирует атрибут maxOccurs в элементе <element> в соответствии со следующими возможными значениями.

  • 1: программа Xsd.exe создает поле, тип которого соответствует типу данных элемента.

  • 0: программа Xsd.exe не обрабатывает значение 0, рассматривая его как значение по умолчанию 1.

  • unbounded: программа Xsd.exe создает поле, представляющее собой массив типа, соответствующего типу данных элемента.

  • Любое целое число, превышающее 1: как и в случае значения unbounded, программа Xsd.exe создает поле, представляющее собой массив типа, соответствующего типу данных элемента. Можно принудительно задать значение больше 1, проверив XML-документ при помощи класса XmlValidatingReader по документу схемы XML, представленному моделью SOM.

При создании документа схемы XML из набора классов в сборке программа Xsd.exe обращает предыдущие преобразования, создавая атрибут maxOccurs со значением 1 из одиночного экземпляра и атрибут maxOccurs со значением unbounded из массива.

Хотя программа Xsd.exe привязывает значение unbounded атрибута maxOccurs к массиву, она привязывает значение 1 атрибута maxOccurs к назначенному родительскому элементу массива (если он указан). В описании атрибута Поддержка привязки атрибута MaxOccurs приведены дополнительные сведения об обработке элемента maxOccurs для привязок массивов, включая указание дополнительного родительского элемента.

minOccurs

Для элемента <element> программа Xsd.exe проверяет значение атрибута minOccurs только в том случае, если значение атрибута Поддержка привязки атрибута MaxOccurs не указывает поле массива. Затем значение интерпретируется в зависимости от различных факторов, начиная с того, имеет ли соответствующее поле ссылочный тип или тип значения.

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

name

Для создания исходного кода из XSD-документа значение атрибута name используется как имя открытого поля класса, представляющего элемент. Если элемент <element> содержит анонимное определение <complexType>, это имя становится именем класса, соответствующего данному сложному типу.

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

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

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

nillable

Программа Xsd.exe считает атрибут nillable равным значению свойства IsNullable определенных атрибутов, относящихся к XML-сериализации и применяемых к ссылочным типам. Если для типов значений атрибут nillable имеет значение true, создаются типы, допускающие значение NULL.

См. описание атрибута nillable. Атрибут nillable встречается только в элементе <element>.

ref

При формировании типа платформы .NET Framework из сложного типа схемы XML программа Xsd.exe не делает различия между локально объявленным элементом и ссылкой на глобально объявленный элемент, если только глобальный элемент не объявлен в пространстве имен, отличном от целевого пространства имен схемы.

См. разделы «Ссылка в рамках одного пространства имен» и «Ссылка на другое пространство имен».

substitutionGroup

Инструмент Xsd.exe распознает группы подстановки, только если заменяемый элемент объявлен как абстрактный. Затем при обратном преобразовании программа Xsd.exe создает элемент <choice>, содержащий элемент <element> для каждого подстановочного элемента.

См. предшествующий раздел «Атрибут SubstitutionGroup».

type

Программа Xsd.exe связывает типы данных, на которые ссылается атрибут type объявлений <element> и <attribute>, с типами .NET Framework.

Программа Xsd.exe не создает тип .NET Framework для типа данных схемы XML, если этот тип данных нельзя проследить до глобального объявления элемента, которое связано с типом данных (возможно, другим) через атрибут type.

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

Возможные дочерние элементы: <annotation>, <complexType>, <key>, <keyref>, <simpleType>, <unique>

См. также

Справочник

XmlSchemaElement