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

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

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

Программа Xsd.exe приравнивает атрибут XML form к свойству Form атрибута XmlAttribute или XmlElement, хотя код сериализации платформы .NET Framework распознает другое значение по умолчанию для элементов — qualified.

Объяснение

Схема XML требует, чтобы все глобально объявленные элементы и атрибуты (например, дочерние элементы элемента <schema>) указывались в документе экземпляра вместе с пространством имен. Для элементов и атрибутов, объявленных локально (в рамках определения <complexType>), указание пространства имен необязательно.

Чтобы задать необходимость указания пространства имен для конкретного локального элемента или атрибута, в локальном объявлении элемента <element> или <attribute> добавляется атрибут form. Допустимые значения: qualified и unqualified.

Значение по умолчанию атрибута form наследуется либо от атрибута elementFormDefault, либо от атрибута attributeFormDefault корневого элемента <schema>. Оба эти атрибута имеют значение по умолчанию unqualified.

Платформа .NET Framework не дает возможности задать атрибут form на глобальном уровне или уровне схемы в рамках определения класса. Вместо этого при генерировании документа схемы XML из набора классов программа Xsd.exe всегда создает схему XML со следующими характеристиками:

  • Не задано значение attributeFormDefault, принимается значение по умолчанию unqualified.

  • Задано значение elementFormDefault="qualified", фактически используется значение по умолчанию, отличное от того, что использует схема XML.

Программа Xsd.exe реагирует на значения, отличные от значений по умолчанию attributeFormDefault="qualified" и elementFormDefault="unqualified", задавая атрибут form для каждого поля.

Учитывая эти ограничения, программа Xsd.exe создает исходный код из атрибута form, как показано в таблице.

Атрибут form

form="qualified"

form="unqualified"

<attribute> element

Объявление атрибута XmlAttribute передается параметр Form=XmlSchemaForm.Qualified.

Объявлению атрибута XmlAttribute для поля <attribute> не передается параметр form.

<element> element

Атрибут XmlElement не применяется, кроме как для передачи несвязанного параметра.

Объявлению атрибута XmlElement для поля <element> передается параметр Form=XmlSchemaForm.Unqualified.

Параметр, переданный объявлением XmlAttribute или XmlElement, задает свойство Form, возможные значения которого берутся из перечисления XmlSchemaForm:

  • XmlSchemaForm.Qualified

  • XmlSchemaForm.Unqualified

  • XmlSchemaForm.None: по умолчанию

Свойство Form задается только в исходном коде, если в первоначальном документе схемы XML оно имеет значение, отличное от значения по умолчанию (в соответствии с умолчаниями платформы .NET Framework, а не умолчаниями схемы XML). Так как атрибут form переопределяет атрибуты attributeFormDefault и elementFormDefault, из схемы, задающей для атрибута form значение, отличное от значения по умолчанию, на уровне элемента <schema> и затем задающей его по умолчанию на уровне <attribute> или <element>, создается код, где атрибут form не задан. Если говорить о согласовании документов экземпляров, значение то же самое.

Example

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="ComplexInstance" type="MyComplexType"/>
  <xsd:complexType name="MyComplexType">
    <xsd:sequence>
      <xsd:element name="elementQ" type="xsd:decimal" form="qualified" />
      <xsd:element name="elementU" type="xsd:Date" form="unqualified" />
    </xsd:sequence>
    <xsd:attribute name="attributeQ" type="xsd:string"  use="required" form="qualified"/>
    <xsd:attribute name="attributeU" type="xsd:boolean" use="required" form="unqualified"/>
  </xsd:complexType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("ComplexInstance", Namespace="http://example.org/", IsNullable=false)]
 public class MyComplexType {
        
     public System.Decimal elementQ;
        
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string elementU;
        
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string attributeQ;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool attributeU;
}

Документ схемы 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="ComplexInstance" type="tns:MyComplexType" />
  <xs:complexType name="MyComplexType">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="elementQ" type="xs:decimal" />
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="elementU" type="xs:string" />
    </xs:sequence>
    <xs:attribute form="qualified" name="attributeQ" type="xs:string" />
    <xs:attribute name="attributeU" type="xs:boolean" use="required" />
  </xs:complexType>
</xs:schema>

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

См. также

Справочник

System.Xml.Schema.XmlSchemaAttribute.Form
System.Xml.Schema.XmlSchemaElement.Form