Поддержка привязки атрибута Default

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

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

Средство Xsd.exe приравнивает значение элемента или атрибута default атрибуту System.ComponentModel.DefaultValueAttribute, примененному для созданного поля; это поле также статически инициализируется со значением по умолчанию.

Объяснение

Атрибут default, который может встречаться в объявлении элемента <element> или <attribute>, предоставляет значение по умолчанию, используемое, если элемент пуст или атрибут отсутствует при получении документа экземпляра.

Для атрибутов значение по умолчанию подходит, только если атрибут является необязательным (атрибут use, который описывается в разделе Поддержка привязки элемента Attribute, имеет значение по умолчанию optional). Когда атрибут задается, ему должно быть присвоено конкретное значение.

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

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

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

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

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

В соответствии со схемой XML, значение атрибута default должно быть простым типом. Когда программа Xsd.exe выполняет "круговое" преобразование из схемы XML в классы и обратно в новый документ схемы XML, она почти для всех простых типов сохраняет значение по умолчанию.

Исключением являются элементы или атрибуты типа xsd:base64Binary и xsd:hexBinary. Атрибут DefaultValue для соответствующего созданного поля System.Byte не применяется.

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

Рассмотрим следующее объявление входного элемента <attribute>:

<xsd:attribute name="siblings" default="unknown">
  <xsd:simpleType>
    <xsd:list itemType="xsd:string"/>
  </xsd:simpleType>
</xsd:attribute>

Для этого объявления создается следующий исходный код:

[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";

Этот исходный код не проходит компиляцию, поскольку объект String не может быть неявно подвержен приведению типа как массив объектов String. Такая же ошибка возникает для списков любого простого типа, включая типы перечисления.

Влияние на атрибут minOccurs для типов значений привязки элементов

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

Сочетание с атрибутом use="optional" для атрибутов

Предположим, что объявление элемента <attribute> содержит атрибут use со значением optional, являющимся также значением по умолчанию. При создании исходного кода из документа XSD интерпретация этого значения программой Xsd.exe зависит от того, задан ли атрибут default. Ниже приведены два возможных варианта интерпретации.

  • Атрибут default задан: программа Xsd.exe создает открытое поле с атрибутом XmlAttributeAttribute и атрибутом DefaultValueAttribute, указывающим значение по умолчанию.

  • Атрибут default не задан: программа Xsd.exe создает открытое поле с атрибутом XmlAttributeAttribute. Кроме того, для типов значений она создает открытое поле типа bool, именем которого является имя поля атрибута с присоединенным словом Specified. Например, если имя поля атрибута — startDate, именем поля bool будет startDateSpecified. При сериализации объекта в XML класс XmlSerializer проверяет значение поля bool, чтобы определить, записывать ли необязательный атрибут. Поле bool имеет атрибут System.Xml.Serialization.XmlIgnoreAttribute для предотвращения сериализации объектом XmlSerializer.

Example

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

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

    <xsd:complexType name="FamilyDogType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:stringo" default="Spot"/>
            <xsd:element name="birthdate" type="xsd:date" default="2002-03-04"/>
        </xsd:sequence>
        <xsd:attribute name="gender" type="GenderType" default="UNKNOWN"/>
        <xsd:attribute name="fixed" type="xsd:boolean" default="false"/>
        <xsd:attribute name="breed" type="xsd:string" default="Swedish Vallhund"/>
    </xsd:complexType>
    
    <xsd:simpleType name="GenderType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="FEMALE" />
            <xsd:enumeration value="MALE" />
            <xsd:enumeration value="UNKNOWN" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyDog", Namespace="http://example.org/", IsNullable=false)]
public class FamilyDogType {
        
    [System.ComponentModel.DefaultValueAttribute("Spot")]
    public string name = "Spot";
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="date")]
    [System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
    public System.DateTime birthdate = new System.DateTime(631507968000000000);
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(GenderType.UNKNOWN)]
    public GenderType gender = GenderType.UNKNOWN;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @fixed = false;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("Swedish Vallhund")]
    public string breed = "Swedish Vallhund";
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum GenderType {        
    FEMALE,        
    MALE,
    UNKNOWN,
}

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

Возможные содержащие элементы: <attribute>, <element>

См. также

Справочник

System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue