Поддержка привязки элемента 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.
Примечание |
---|
Несмотря на то что во время выполнения .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 создает значение См. описание атрибута Поддержка привязки атрибута MinOccurs. |
namespace |
См. подраздел «Атрибуты namespace и processContents» в этом разделе. |
processContents |
См. подраздел «Атрибуты namespace и processContents» в этом разделе. |
Возможные родительские элементы: <choice>, <sequence>
Возможные дочерние элементы: <annotation>