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

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

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

Для определения сложных типов путем расширения средство Xsd.exe приравнивает атрибут XML mixed="true" полю массива строк с примененным атрибутом XmlTextAttribute.

Объяснение

Атрибут mixed может присутствовать в элементах complexType и complexContent. Значение true указывает, что элемент может содержать дочерние элементы или основной текст (нетипизированные символьные данные) или сочетание дочерних элементов и основного текста.

Значение mixed для элемента <complexContent> переопределяет значение mixed для элемента <complexType> в соответствии со схемой XML. Элемент <complexContent>, если он присутствует, является единственным дочерним элементом элемента <complexType>.

Программа Xsd.exe сопоставляет значение true атрибута mixed с полем массива строк с атрибутом System.Xml.Serialization.XmlTextAttribute следующим образом:

[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;

Атрибут XmlText указывает классу XmlSerializer сериализовать член класса как основной текст. Привязка работает в двух направлениях: при создании XSD-файла из классов и при создании исходного кода из XSD-файла.

Создание производных типов посредством расширения

Спецификация схемы XML запрещает переключение между смешанным содержимым и содержимым на основе только элементов посредством расширения:

  • схема XML запрещает создание сложных типов со смешанным содержимым посредством расширения сложных типов с несмешанными дочерними элементами;

  • схема XML запрещает также создание сложных типов с несмешанными дочерними элементами посредством расширения сложных типов со смешанным содержимым.

Если при создании исходного кода из документа схемы XML программа Xsd.exe встречает любое из таких недопустимых расширений, она выдает следующее предупреждение:

Предупреждение при проверке схемы: тип контента производного и базового типов должен быть одинаковым.

В то же время программа Xsd.exe размещает ранее описанное поле массива строк с атрибутом XmlText в производном классе, где вводится смешанное содержимое. В результате потомки имеют смешанное содержимое.

Приведенное выше предупреждение выдается, когда сложный тип предка имеет дочерние элементы, а сложный тип потомка указывает mixed="true". Это предупреждение выводится также тогда, когда сложный тип предка задает значение true для атрибута mixed, а сложный тип потомка явно не задает значение true в элементе <complexContent> или <complexType>.

Вообще, при создании документа схемы XML из набора классов в сборке программа Xsd.exe присваивает атрибуту mixed значение true в следующих элементах.

  • <complexType>: для сложного типа, где вводится смешанное содержимое. Тип соответствует классу, который содержит поле массива строк с атрибутом XmlText. Чтобы схема была допустимой, тип данных не должен быть базовым сложным типом, как объясняется ниже в данном разделе.

  • <complexContent>: для сложных типов потомков.

Даже при этих условиях при использовании документа схемы XML программа Xsd.exe допускает запись <complexType mixed="true"> для указания унаследованного смешанного содержимого для типов потомков, даже если запись <complexContent mixed="false"> по умолчанию должна переопределить указанную выше запись. При обратном преобразовании из созданного кода восстанавливается ожидаемая форма, как показано ниже:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

Существует одна ситуация, когда смешанное содержимое может быть введено в производном сложном типе: базовый сложный тип не содержит дочерних элементов (он может иметь атрибуты). Однако существует также одна ситуация, когда программа Xsd.exe при "круговом" преобразовании создает схему XML с другим значением.

Производный тип, который вводит смешанное содержимое, должен быть задан следующим образом:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

При обратном преобразовании программа Xsd.exe переключает размещение mixed="true", как показано в следующем фрагменте:

<complexType mixed="true">
    <complexContent mixed="false">
        ...
    </complexContent>
</complexType>

Здесь в соответствии со схемой XML значение false элемента <complexConten>> должно переопределить значение true элемента <complexType>, делая содержимое производного типа несмешанным и изменяя первоначальную цель.

Возникает ошибка, поскольку для сложного типа, где вводится смешанное содержимое, программа Xsd.exe всегда присваивает атрибуту mixed значение true в элементе <complexType>, но не в элементе <complexContent>, если он присутствует.

Кроме того, когда программа Xsd.exe принимает такие инвертированные выходные данные в качестве входных данных, она интерпретирует производный тип как ввод смешанного содержимого, делая поле массива строк с атрибутом XmlText членом соответствующего класса. Как было отмечено ранее, программа Xsd.exe допускает запись <complexType mixed="true"> для указания унаследованного смешанного содержимого для типов потомков, даже если запись <complexContent mixed="false> должна переопределить указанную выше запись.

Создание производных типов посредством ограничения

Схема XML допускает ограничение сложных типов со смешанным содержимым для получения сложных типов с несмешанными дочерними элементами. Однако платформа .NET Framework не распознает ограничение сложных типов. Вместо этого программа Xsd.exe создает пустой класс, наследуемый от базового класса. См. описание элемента <restriction>.

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

См. также

Справочник

System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed