本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.
.NET Framework 为 minOccurs 特性提供部分绑定支持。
Xsd.exe 只为 <element> 元素检查 minOccurs 特性的值,并且只有当 maxOccurs 特性绑定支持 特性的值不要求数组字段时才进行此项检查。然后,从对应的字段属于引用类型还是值类型开始,按照各种因素解释(或生成)值。
说明
minOccurs 和 maxOccurs 特性限制指定的实体可以连续出现在 XML 实例文档中的对应位置的次数。
这些特性仅出现在复杂类型定义中。因此,对于 <element> 或 <group> 元素而言,元素必须是局部声明或对全局声明的引用,而不能是全局声明本身。
对于用非 XML 特定的类绑定 XML 架构复杂类型,.NET Framework 不提供与 minOccurs 或 maxOccurs 特性等效的直接编程语言。
将 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
,以及 maxOccurs 值 unbounded
。
若要理解类型与数组之间的绑定,请考虑声明某一类型的对象与为该对象赋值(确切地说是堆栈或堆中的内存位置)之间的不同。从下面的 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.MinOccurs 和 System.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 类将生成值为 true
的 xsi: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 指定的值类型。 |
|
伴随有公共 bool 字段(该字段使用前面“将 XSD 翻译成源代码”中介绍的 |
|
既没有默认值也没有伴随的布尔型字段的值类型。 |
|
XmlElement 特性的 IsNullable 属性设置为 |
|
带 |
|
Xsd.exe 在从 XML 架构文档到源代码的反向翻译过程中保留这些与众不同的功能。
**注意:**如果 default XML 特性与设置为 0
的 minOccurs 特性一起出现,并且数据类型映射到值类型,将只生成 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
设置的过程中,仍然会生成 minOccurs 值 0
,并且数组元素仍然可以不存在。
如果应用了默认的 XmlArray 特性,将创建一个名称以 ArrayOf 开头的架构数据类型以表示数组的父元素。有关数组绑定的更多信息,请参见 maxOccurs 特性和使用特性控制 XML 序列化。
父元素架构数据类型对应于引用类型,Xsd.exe 在生成 minOccurs 值时将其作为引用类型来处理。也就是说,如果 IsNullable 属性按如下所示设置为 true
,将生成 minOccurs 值 1
:
[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]
否则,将生成 minOccurs 值 0
。
**<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