Поддержка привязки атрибута 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> |
Объявление атрибута XmlAttribute передается параметр |
Объявлению атрибута XmlAttribute для поля <attribute> не передается параметр form. |
<element> |
Атрибут XmlElement не применяется, кроме как для передачи несвязанного параметра. |
Объявлению атрибута XmlElement для поля <element> передается параметр |
Параметр, переданный объявлением 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