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

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

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

При создании исходного кода из документа схемы XML программа Xsd.exe преобразует элемент <any> в поле типа XmlElement с атрибутом XmlAnyElementAttribute.

Объяснение

Подстановочный элемент <any> позволяет любому элементу (элементу с любым именем и любого типа) присутствовать в определенной позиции в документе экземпляра XML с некоторыми ограничениями.

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

Если элемент <any> имеет атрибут maxOccurs со значением больше 1 или unbounded, программа Xsd.exe создает массив XmlElement с атрибутом XmlAnyElement. Один элемент XmlElement создается, если значение атрибута maxOccurs равняется 1 (по умолчанию) или 0. Объяснение см. в разделе об атрибуте maxOccurs.

При создании документа схемы XML из набора классов в сборке программа Xsd.exe выполняет обратное преобразование: поле или свойство типа System.Xml.XmlElement с атрибутом XmlAnyElementAttribute преобразуется в элемент <any>.

Атрибуты namespace и processContents

В процессе создания определений или классов схемы XML атрибуты namespace и processContents не учитываются. Это значит, что, какими бы ни были значения этих атрибутов в исходном определении схемы XML, после того как Xsd.exe создаст классы из определения, а затем создаст другую схему XML из этих классов, в новой созданной схеме XML у элемента <any> уже не будет этих атрибутов. Поэтому последняя схема возвращается к следующим значениям по умолчанию:

  • namespace="##any". Атрибут namespace задает пространства имен, в которых должен быть определен элемент. Значение ##any разрешает любое пространство имен.

  • processContents="strict". При проверке экземпляра документа XML на соответствие заданной схеме XML убедитесь, что все типы элементов проверены в соответствии с заданными пространствами имен. Если тип элемента не распознан, проверка завершается с ошибкой.

Аналогично, при десериализации из документов XML в объекты атрибуты namespace и processContents игнорируются. Вместо этого класс XmlSerializer предполагает, что эти два атрибута имеют следующие значения:

  • namespace="##any". Это значение по умолчанию.

  • processContents="lax". При проверке документа экземпляра XML на соответствие заданной схеме XML следует проверять элемент только в том случае, если можно получить его пространство имен. В противном случае убедитесь, что нераспознанный элемент содержит корректный XML.

2w8zbwa2.note(ru-ru,VS.100).gifПримечание
Несмотря на то что во время выполнения .NET Framework предполагает processContents="lax", во время развертывания .NET Framework генерирует определения схемы XML, где неявно задано значение по умолчанию processContents="strict".

Программа Xsd.exe и класс XmlSerializer предоставляют одинаковые привязки для атрибутов namespace и processContents, когда они присутствуют в элементе <anyAttribute>.

Пример

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

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

    <xsd:complexType name="MyComplexType">
        <xsd:sequence>
            <xsd:element name="field1" type="xsd:string"/>
            <xsd:any namespace="##local" processContents="strict"/>
        </xsd:sequence>
    </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 string field1;
        
    [System.Xml.Serialization.XmlAnyElementAttribute()]
    public System.Xml.XmlElement Any;
}

Сложный тип схемы 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="0" maxOccurs="1" name="field1" type="xs:string" />
      <xs:any minOccurs="0" maxOccurs="1" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

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

id

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

maxOccurs

См. подраздел "Объяснение" в этом разделе. Также см. описание атрибута Поддержка привязки атрибута MaxOccurs.

minOccurs

При создании исходного кода из документа схемы XML программа Xsd.exe не обрабатывает атрибут minOccurs для элемента <any>.

При создании XSD-документа из классов программа Xsd.exe создает значение 0 для атрибута minOccurs в элементе <any>.

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

namespace

См. подраздел «Атрибуты namespace и processContents» в этом разделе.

processContents

См. подраздел «Атрибуты namespace и processContents» в этом разделе.

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

Возможные дочерние элементы: <annotation>

См. также

Справочник

XmlSchemaAny