minOccurs 特性绑定支持

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

.NET Framework 为 minOccurs 特性提供部分绑定支持。

Xsd.exe 只为 <element> 元素检查 minOccurs 特性的值,并且只有当 maxOccurs 特性绑定支持 特性的值不要求数组字段时才进行此项检查。然后,从对应的字段属于引用类型还是值类型开始,按照各种因素解释(或生成)值。

说明

minOccursmaxOccurs 特性限制指定的实体可以连续出现在 XML 实例文档中的对应位置的次数。

这些特性仅出现在复杂类型定义中。因此,对于 <element><group> 元素而言,元素必须是局部声明或对全局声明的引用,而不能是全局声明本身。

对于用非 XML 特定的类绑定 XML 架构复杂类型,.NET Framework 不提供与 minOccursmaxOccurs 特性等效的直接编程语言。

将 XSD 翻译成源代码

当从 XML 架构文档生成源代码时,Xsd.exe 将忽略应用于 <choice><sequence><group><all><any> 元素的 minOccurs 特性。

对于 <element> 元素,如果 maxOccurs 特性的值大于 1 或为 unbounded,Xsd.exe 将忽略 minOccurs 特性。在这种情况下,该工具将生成一个类型与 XSD 数据类型对应的数组。Xsd.exe 使用 maxOccurs 特性的值确定是生成单个实例还是数组。

对于 <element> 元素,如果它应用于转换为 .NET Framework 引用类型的架构数据类型,则 Xsd.exe 还将忽略 minOccurs 特性。

只有当以下所有条件均满足时,Xsd.exe 才会使用 minOccurs 特性的值:

  • 涉及 <element> 元素。

  • maxOccurs 特性要求单个实例。

  • 数据类型转换成值类型。

然后工具按如下所述解释该值:

  • 1 or more:Xsd.exe 生成一个公共字段。未应用 XML 相关特性,因此将使用默认的 System.Xml.Serialization.XmlElementAttribute

  • 0:Xsd.exe 生成一个公共字段。未应用 XML 相关特性,因此将使用默认的 XmlElementAttribute。另外,Xsd.exe 还生成 bool 类型的公共字段,其名称为追加了 Specified 的元素字段名称。例如,如果元素字段的名称为 startDate,则 bool 字段的名称将为 startDateSpecified。将某个对象序列化为 XML 时,XmlSerializer 类检查 bool 字段的值,以确定是否写入该元素。出现的 bool 字段将具有 System.Xml.Serialization.XmlIgnoreAttribute,以防止它被 XmlSerializer 序列化。

**有关数组绑定的更多信息。**当 Xsd.exe 在 maxOccurs 特性值要求数组绑定的情况下忽略 minOccurs 特性时,定义的精确性将会降低。当从生成的数组反向转换为新的 <element> 声明时,不会生成原始的 minOccurs 值,而是生成值 0,以及 maxOccursunbounded

若要理解类型与数组之间的绑定,请考虑声明某一类型的对象与为该对象赋值(确切地说是堆栈或堆中的内存位置)之间的不同。从下面的 XSD 元素开始:

<xsd:element minOccurs="5" maxOccurs="5" name="items" type="xsd:token" />

手动编写代码时,您不会在类型声明(可能为 public string[] items)中将数组大小表示为 5,而是在赋值时表示数组大小:items = new string[5]

Xsd.exe 从 XML 架构生成的仅有的几种源代码是类型和字段声明,以及可以作为特性应用于类型和字段的元数据。为对象赋值超越了这一范围。

可以使用 XmlValidatingReader 类对照架构对象模型 (SOM) 表示的 XML 架构文档验证 XML 文档,从而强制使用大于 1 的值。SOM 使用 System.Xml.Schema.XmlSchemaParticle.MinOccursSystem.Xml.Schema.XmlSchemaParticle.MinOccursString 属性,这两者均应用于可以包含 minOccurs 特性的所有元素。

有关 Xsd.exe 如何处理不同的 XML 架构定义语言元素中的匹配项约束的更多信息,请参见 maxOccurs 特性。

将源代码翻译成 XSD

在从类生成 XML 架构文档时,Xsd.exe 生成的 minOccurs 值取决于正在生成的包含该值的 XML 架构定义语言元素。下面列出了可能的包含元素以及它们的 minOccurs 行为:

<choice>:如果选项表示单个对象,则为 1;如果选项表示一个数组,则为 0

<sequence>:未指定,恢复为默认的 1

<group>:Xsd.exe 不会基于源代码生成 <group> 元素。

<all>:Xsd.exe 不会基于源代码生成 <all> 元素。

<any>:根据 <element> 元素的解释规则,为 0<any> 元素将在本主题的后面部分进一步讨论。

<element>:Xsd.exe 根据以下条件为 minOccurs 生成不同的值:字段或属性是数组还是单个实例;字段或属性具有值类型还是引用类型;值类型是有默认值还是有说明是否指定了值的额外字段;是否为一个引用类型分配了 IsNullable 属性设置为 true 的 XML 相关特性。

IsNullable 属性供某些 XML 相关特性类使用。该属性如下所示:

如果一个类成员的 IsNullable 属性设置为 true,一个对象设置为 null 引用(在 Visual Basic 中为 Nothing),则 XmlSerializer 类将生成值为 truexsi:nil 特性。(前缀 xsi 用于架构实例命名空间,http://www.w3.org/2001/XMLSchema-instance)。

在实例文档内的元素中出现的 xsi:nil="true" 显式声明了该元素没有任何内容(无论是子元素还是正文文本)。请参见 xsi:nil 特性。

IsNullable 属性对应于 XML 架构定义语言中的 nillable 特性。如果在从类生成 XSD 定义的过程中,Xsd.exe 遇到一个类或成员的 IsNullable 属性值为 true(并且可以为该类型分配一个空引用),则将为对应的 XSD <element> 元素生成 nillable="true" 设置。请参见 nillable 特性。

下表中显示的规则确定了对应于作为单个实例的类成员的 minOccurs 特性的值。数组也遵循这些规则,但有一个例外,这将在本主题的后面部分进行说明。该表按照相关类成员的变体及产生的 minOccurs 值进行组织:

输入类成员

输出 <element> 元素的 minOccurs 值

默认值通过 System.Component.DefaultValueAttribute 指定的值类型。

0. 在 <element> 元素中,默认值也通过 default XML 特性指定。

伴随有公共 bool 字段(该字段使用前面“将 XSD 翻译成源代码”中介绍的 Specified 命名约定)的值类型。

0.

既没有默认值也没有伴随的布尔型字段的值类型。

1.

XmlElement 特性的 IsNullable 属性设置为 true 的引用类型。

1. 在 <element> 元素中,nillable 特性也设置为 true

IsNullable=false 或不带 IsNullable 设置的引用类型。

0.

Xsd.exe 在从 XML 架构文档到源代码的反向翻译过程中保留这些与众不同的功能。

**注意:**如果 default XML 特性与设置为 0minOccurs 特性一起出现,并且数据类型映射到值类型,将只生成 DefaultValue 特性。不会生成伴随的布尔型字段。另请参见 default 特性。

例如,假设在输入源文件中遇到下面的元素:

<xsd:element name="birthdate" type="xsd:date" default="2002-03-04" minOccurs="0" />Xsd.exe would then produce: 
[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
public System.DateTime birthdate = new System.DateTime(631507968000000000);

数组绑定。 Xsd.exe 始终为数组生成以下形式的 <element> 声明。

<element minOccurs="0" maxOccurs="unbounded" />

这是事实,因为数组类型是引用类型。然而,与其他引用类型不同的是,即使下面的特性声明应用于数组成员,这也成立:

[XmlElementAttribute(IsNullable=true)]

XmlElement 特性(而非默认的 XmlArrayAttribute)应用于数组时,数组元素将作为绑定到该类的元素的子级出现在实例文档中。未严格引入充当数组元素父级的额外元素。在 Xsd.exe 通过生成具有 nillable="true" 的元素来识别 IsNullable=true 设置的过程中,仍然会生成 minOccurs0,并且数组元素仍然可以不存在。

如果应用了默认的 XmlArray 特性,将创建一个名称以 ArrayOf 开头的架构数据类型以表示数组的父元素。有关数组绑定的更多信息,请参见 maxOccurs 特性和使用特性控制 XML 序列化

父元素架构数据类型对应于引用类型,Xsd.exe 在生成 minOccurs 值时将其作为引用类型来处理。也就是说,如果 IsNullable 属性按如下所示设置为 true,将生成 minOccurs1

[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]

否则,将生成 minOccurs0

**<any> 元素。**Xsd.exe 之所以为 <any> 元素(无论涉及单个对象还是数组)生成 minOccurs="0",是因为等效的代码构造为引用类型。该构造是 System.Xml.XmlElement 类型(或其数组)的字段,具有 System.Xml.Serialization.XmlAnyElementAttribute 特性。特性声明 [XmlElementAttribute(IsNullable=true)] 可以应用于 XmlElement 对象或数组,但是 Xsd.exe 不会将此用法解释为带 minOccurs="1"<any> 元素。

可能的包含元素:<all><any><choice><element><group><sequence>

另请参见

参考

System.Xml.Schema.XmlSchemaParticle.MinOccurs
System.Xml.Schema.XmlSchemaParticle.MinOccursString
XmlSchemaAll
XmlSchemaAny
XmlSchemaChoice
XmlSchemaElement
XmlSchemaGroupRef
XmlSchemaSequence