schema 元素绑定支持

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

.NET Framework 为 <schema> 元素提供绑定支持。

<schema> 元素是 XML 架构文档的根元素。

说明

<schema> 元素是 XML 架构文档的根元素。

<schema> 元素的特性中,blockDefaultfinalDefaultidversion 特性不绑定到 .NET Framework 代码实体。系统能够识别 targetNamespace 特性,但只能部分识别 attributeFormDefaultelementFormDefault 特性。请参见下表。有关详细信息,请参阅各个特性主题。

targetNamespace 特性

根元素 <schema>targetNamespace 特性将架构的命名空间指定为统一资源标识符 (URI)。Xsd.exe 工具将 <schema> 元素的 targetNamespace 特性与各个 XML 相关特性的 Namespace 属性关联。

当从 XML 架构文档生成源代码时,Xsd.exe 按如下方式使用 targetNamespace 值:

  • 对于所生成的、与架构中的数据类型对应的每个类型,Xsd.exe 都将 System.Xml.Serialization.XmlTypeAttribute.Namespace 属性设置为 targetNamespace 值。

  • 对于所生成的、与可能显示为符合架构的 XML 文档的根的数据类型对应的每个类型,Xsd.exe 都将 System.Xml.Serialization.XmlRootAttribute.Namespace 属性设置为 targetNamespace 值。如果某个数据类型由全局声明为根元素 <schema> 的子级的 <element> 元素使用,则该数据类型可能会显示为文档的根。

当基于程序集中的一组类生成 XML 架构文档时,Xsd.exe 会创建一个 XML 架构文档,对于它在某些 XML 相关特性类的 Namespace 属性中找到的每个唯一值,该文档都具有一个唯一的 targetNamespace 特性。该属性如下所示:

attributeFormDefault 特性

Xsd.exe 实用工具生成将全局 attributeFormDefault 特性保留为未指定的 XML 架构。当它在现有的架构中遇到该特性时,会相应地设置每个非重写字段的 XmlAttributeAttributeForm 属性。

说明:attributeFormDefault 特性

XML 架构要求全局声明为 <schema> 元素子级的所有元素和特性在实例文档中都显示已限定了命名空间。对于在 <complexType> 定义中局部声明的元素和特性,命名空间限定是可选的。

若要为 XML 架构文档中声明的所有局部元素和特性控制命名空间限定,应分别使用根元素 <schema>elementFormDefaultattributeFormDefault 特性。对于两者而言,可能的值均为 qualifiedunqualified,默认值为 unqualified

此外,form 特性还可以用在局部的 <element><attribute> 声明中,以重写该特定元素或特性的架构默认值。

下表描述了 Xsd.exe 如何处理 attributeFormDefault 的三个可能选项:qualifiedunqualified 和未指定。(请记住,当从 XML 架构文档生成源代码时,Xsd.exe 会为每个 XML 特性创建一个公共字段,并为该字段应用一个 .NET Framework 特性 XmlAttributeAttribute。)

可能的 attributeFormDefault 值

Xsd.exe 从 XSD 生成的源代码

Xsd.exe 基于通过相同的源代码编译得到的程序集生成的 XSD

attributeFormDefault="unqualified"

显示与特性对应的类和字段,但不指定表单。

未指定,恢复为默认的 attributeFormDefault="unqualified"

Unspecified

显示与特性对应的类和字段,但不指定表单。

未指定,恢复为默认的 attributeFormDefault="unqualified"

attributeFormDefault="qualified"

显示与局部声明的特性和引用的全局声明特性相对应的字段,并向 XmlAttribute 特性传递 Form=XmlSchemaForm.Qualified

未指定,恢复为默认的 attributeFormDefault="unqualified"

另外,每个特性声明都指定 form="qualified"。这包括引用的全局声明特性。

传递到 XmlAttribute 声明的参数设置 Form 属性,该属性的可能值来自 XmlSchemaForm 枚举:

  • XmlSchemaForm.Qualified

  • XmlSchemaForm.Unqualified

  • XmlSchemaForm.None:默认值

使用 XmlAttribute 参数的一个结果是,在原始 XSD 文档中曾经是全局设置的内容现在将基于源代码和所生成的 XSD 中的每个 XML 特性进行指定。始终假定未指定全局 attributeFormDefault 特性,而恢复为默认值 unqualified

示例:attributeFormDefault 特性

输入 XML 架构文档,其中 attributeFormDefault="qualified"

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified"
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:attribute name="version" type="xsd:string"/>
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required"/>
  </xsd:complexType>
  <xsd:element name="key" type="keyInfo"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string version;
        
    System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public bool @public;
}

XML 架构的根元素 <schema>,该元素是基于通过前面的 C# 源代码编译得到的程序集生成的(出现的特性声明同样没有 form 特性):

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   ...
</xs:schema>

elementFormDefault 特性

Xsd.exe 实用工具生成将全局 elementFormDefault 特性保留为 "qualified" 的 XML 架构。当它在现有的架构中遇到该特性时,会相应地设置每个非重写字段的 XmlElementAttributeForm 属性。

说明:elementFormDefault 特性

XML 架构要求全局声明为 <schema> 元素子级的所有元素和特性在实例文档中都显示已限定了命名空间。对于在 <complexType> 定义中局部声明的元素和特性,命名空间限定是可选的。

若要为 XML 架构文档中声明的所有局部元素和特性控制命名空间限定,应分别使用根元素 <schema>elementFormDefaultattributeFormDefault 特性。对于两者而言,可能的值均为 qualifiedunqualified,默认值为 unqualified

此外,form 特性还可以用在局部的 <element><attribute> 声明中,以重写该特定元素或特性的架构默认值。

尽管 elementFormDefault 的默认值为 unqualified,但是 .NET Framework 实际上将该默认值视为 qualified,同时仍然允许使用 unqualified。下表描述了 Xsd.exe 如何处理 elementFormDefault 的三个可能选项:qualifiedunqualified 和未指定。(请记住,当从 XML 架构文档生成源代码时,Xsd.exe 会为每个 XML 元素创建一个公共字段。)

可能的 elementFormDefault 值

Xsd.exe 从 XSD 生成的源代码

Xsd.exe 基于通过相同的源代码编译得到的程序集生成的 XSD

elementFormDefault="qualified"

显示与元素对应的类和字段,但不指定表单。

elementFormDefault="qualified"

Unspecified

显示与元素对应的类和字段,但不指定表单。

elementFormDefault="qualified"

elementFormDefault="unqualified"

显示与局部声明的元素对应的字段,并向 XmlElement 特性传递 Form=XmlSchemaForm.Unqualified。显示与引用的全局声明元素对应的字段,但不指定表单。

elementFormDefault="qualified"

另外,最初为局部声明的每个元素都使用 form="unqualified"。最初为全局声明的元素在局部显示时不带 form 特性。

传递到 XmlElement 声明的参数设置 Form 属性,该属性的可能值来自 XmlSchemaForm 枚举:

  • XmlSchemaForm.Qualified

  • XmlSchemaForm.Unqualified

  • XmlSchemaForm.None:默认值

使用 XmlElement 参数的一个结果是,在原始 XSD 文档中曾经是全局设置的内容在源代码和所生成的 XSD 中将基于每个 XML 元素进行指定。始终假定全局 elementFormDefault 特性具有值 qualified

示例:elementFormDefault 特性

输入 XML 架构文档,其中 elementFormDefault="unqualified"

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="unqualified">
  <xsd:element name="version" type="xsd:string"/>
  <xsd:complexType name="keyInfo">
      <xsd:sequence>
      <xsd:element ref="version" />
      <xsd:element name="public" type="xsd:boolean" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="key" type="keyInfo"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
 public class keyInfo {
        
     public string version;
        
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public bool @public;
}

基于通过前面的 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="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="version" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" form="unqualified" name="public" type="xs:boolean" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

可能的特性 绑定支持

attributeFormDefault

.NET Framework 能够识别默认值 unqualified。Xsd.exe 工具基于每个字段转换 qualified 值,方法是相应地设置每个非重写字段的 XmlAttributeAttributeForm 属性。

请参见前面的“AttributeFormDefault 特性”部分。

blockDefault

<schema> 元素的 blockDefault 特性为 <complexType><element> 元素的 block 特性提供默认值。

Xsd.exe 工具忽略 <schema> 元素的 blockDefault 特性及其各个元素的 block 特性。

elementFormDefault

.NET Framework 实际上使用另一个默认值 qualified。Xsd.exe 工具始终生成具有 elementFormDefault="qualified"<schema> 元素。该工具基于每个字段转换 unqualified 值,方法是相应地设置每个非重写字段的 XmlElementAttributeForm 属性。

请参见前面的“ElementFormDefault 特性”部分。

finalDefault

<schema> 元素的 finalDefault 特性为某些元素的 final 特性提供默认值。

Xsd.exe 工具忽略 <schema> 元素的 finalDefault 特性及其各个元素的 final 特性。

id

Xsd.exe 实用工具会忽略旨在提供唯一标识符的 id 特性。

xml:lang

当命名空间 http://www.w3.org/XML/1198 中的 lang 特性用在根元素 <schema> 中时,Xsd.exe 会忽略该特性。

targetNamespace

Xsd.exe 工具将 <schema> 元素的 targetNamespace 特性与各个 XML 相关特性的 Namespace 属性关联。具体使用哪些特性取决于转换的方向。

请参见前面的“TargetNamespace 特性”部分。

version

version 特性可用于文档。Xsd.exe 工具忽略该特性。

**可能的父元素:**无(根元素)

可能的子元素:<annotation><attribute><attributeGroup><complexType><element><group><import><include><notation><redefine><simpleType>

另请参见

参考

XmlSchema