Поддержка привязки элемента 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 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> имеет значение Когда программа Xsd.exe создает определение <complexType> из класса, она использует имя этого класса в качестве значения атрибута name. Альтернативное имя (значение атрибута name) можно указать с помощью свойства TypeName. См. описание атрибута Поддержка привязки атрибута Name. |
Возможные родительские элементы: <element>, <redefine>, <schema>
Возможные дочерние элементы: <all>, <annotation>, <anyAttribute>, <attribute>, <attributeGroup>, <choice>, <complexContent>, <group>, <sequence>, <simpleContent>