any 元素绑定支持

本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.

.NET Framework 为 <any> 元素提供部分绑定支持。

当从 XML 架构文档生成源代码时,Xsd.exe 将 <any> 元素转换为 XmlElement 类型的字段,该元素具有 XmlAnyElementAttribute 特性。

说明

<any> 通配符允许任何元素(任意名称或类型的元素)出现在 XML 实例文档中的给定位置,但有一些约束。

当从 XML 架构文档生成源代码时,Xsd.exe 将 <any> 元素转换为 XmlElement 类型的字段,该元素具有 XmlAnyElementAttribute 特性。此特性使类可以在不将 XML 元素绑定到其他可能的类字段或类属性标识的非 XML 类型的情况下,表示任意 XML 元素。

如果出现的 <any> 元素具有值大于 1 或者为 unboundedmaxOccurs 特性,则 Xsd.exe 会生成具有 XmlAnyElement 特性的 XmlElement 数组。当 maxOccurs 特性的值为 1(默认值)或 0 时,将生成单个 XmlElement。有关此行为的说明,请参见 maxOccurs 特性。

当基于程序集中的一组类生成 XML 架构文档时,Xsd.exe 会执行反向转换:将类型为 System.Xml.XmlElement 且具有 XmlAnyElementAttribute 特性的字段或属性转换为 <any> 元素。

namespace 和 processContents 特性

在生成 XML 架构定义或类的过程中,将忽略 namespaceprocessContents 特性。这意味着,无论这些特性在初始的 XML 架构定义中具有什么值,当 Xsd.exe 从该定义生成类,然后基于这些类生成另一个 XML 架构时,所生成的 XML 架构的 <any> 元素都不再具有这些特性。因此,所生成的架构将恢复为下列默认值:

  • namespace="##any"namespace 特性指定必须在其中定义元素的命名空间。如果值为 ##any,则允许使用任何命名空间。

  • processContents="strict":在验证实例 XML 文档是否符合为它指定的 XML 架构时,应确保根据指定的命名空间来验证所有的元素类型。如果无法识别元素类型,则验证将失败。

同样,在从 XML 文档反序列化为对象的过程中,将忽略 namespaceprocessContents 特性。而 XmlSerializer 类的行为就好像这两个特性固定为下列值:

  • namespace="##any":这是默认值。

  • processContents="lax":当验证实例 XML 文档是否符合为它指定的 XML 架构时,只有当可以获取元素的命名空间时才对该元素进行验证;否则,应确保无法识别的元素由格式良好的 XML 组成。

2w8zbwa2.note(zh-cn,VS.100).gif注意:
即使在运行时,.NET Framework 也假定 processContents="lax",.NET Framework 在部署时生成在其中隐式指定默认 processContents="strict" 的 XML 架构定义。

Xsd.exe 和 XmlSerializer 类为出现在 anyAttribute 元素中的 namespace<processContents> 特性提供相同的绑定。

示例

输入 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>

基于前面的 XML 架构文档生成的 C# 类:

[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;
}

基于通过前面的 C# 源代码编译得到的程序集生成的 XML 架构复杂类型:

<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 工具会忽略应用于 <any> 元素的 minOccurs 特性。

当从类生成 XSD 文档时,Xsd.exe 工具会为 <any> 元素中的 minOccurs 特性生成值 0

请参见 minOccurs 特性绑定支持 特性。

namespace

请参见本主题中的“namespace 和 processContents 特性”一节。

processContents

请参见本主题中的“namespace 和 processContents 特性”一节。

可能的父元素:<choice><sequence>

可能的子元素:<annotation>

另请参见

参考

XmlSchemaAny