mixed 特性绑定支持

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

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

在通过扩展定义复杂类型时,Xsd.exe 工具将 mixed="true" XML 特性等同于应用了 XmlTextAttribute 的字符串数组字段。

说明

mixed 特性可以出现在 complexTypecomplexContent 元素中。值为 true 指示该元素可以包含子元素或正文文本(即,非类型化字符数据)或这两者的组合。

按照 XML 架构,<complexContent>mixed 值会重写 <complexType>mixed 值。当 <complexContent> 元素存在时,它将是 <complexType> 元素的唯一子级。

Xsd.exe 将 mixed 特性的 true 设置映射到具有 System.Xml.Serialization.XmlTextAttribute 特性的字符串数组字段,如下所示:

[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;

XmlText 特性会指示 XmlSerializer 类将类成员序列化为正文文本。绑定是双向进行的:从类生成 .xsd 文件以及从 .xsd 文件生成源代码。

通过扩展派生类型

XML 架构规范使用扩展禁止在混合内容与仅元素内容之间进行切换:

  • XML 架构禁止通过扩展带非混合子元素的复杂类型来创建具有混合内容的复杂类型。

  • 同样,XML 架构禁止通过扩展带混合内容的复杂类型来创建具有非混合子元素的复杂类型。

如果从 XML 架构文档生成源代码时,Xsd.exe 遇到上述任何一种非法扩展,它都会发出下面的警告:

架构验证警告:派生类型和基类型必须具有相同的内容类型。

同时,Xsd.exe 会将上面描述的具有 XmlText 特性的字符串数组字段放入引入混合内容的派生类中。这会导致所有子代都具有混合内容。

当祖先复杂类型具有子元素而子代复杂类型指定 mixed="true",就会发出上面的警告。当祖先复杂类型为 mixed 特性指定 true 值,而子代复杂类型未在 <complexContent><complexType> 元素中显式指定 true 值时,也会发出上面的警告。

通常,当基于程序集中的一组类生成 XML 架构文档时,Xsd.exe 会在下面的元素中将 mixed 特性设置为 true

  • <complexType>:适用于引入混合内容的复杂类型。该类型对应于包含具有 XmlText 特性的字符串数组字段的类。若要使架构有效,该数据类型不必是基复杂类型,本主题稍后将对此进行说明。

  • <complexContent>:适用于子代复杂类型。

虽然如此,但当使用 XML 架构文档时,Xsd.exe 会接受 <complexType mixed="true"> 以指示子代类型继承混合内容,即使默认 <complexContent mixed="false"> 重写它也是如此。当从生成的代码进行反向转换时,会还原为需要的形式,如下所示:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

有一种情况可以在派生复杂类型中引入混合内容:基复杂类型不包含子元素(它可以拥有特性)时。但也有可能是另外一种情况:Xsd.exe 在进行往返转换时使用了不同的方式来生成 XML 架构。

应按如下所示指定引入混合内容的派生类型:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

在进行反向转换时,Xsd.exe 切换 mixed="true" 的位置,如下面的摘录所示:

<complexType mixed="true">
    <complexContent mixed="false">
        ...
    </complexContent>
</complexType>

在这里,按照 XML 架构,<complexContent> 元素的 false 值应重写 <complexType> 元素的 true 值,这将使派生类型的内容变为非混合内容,从而违背原来的意图。

出现这种错误是因为,对于引入混合内容的复杂类型,Xsd.exe 始终会将 <complexType> 元素而非 <complexContent> 元素(如果存在)中的 mixed 特性设置为 true

而且,当 Xsd.exe 将此反向转换输出作为输入接收时,它会循惯例将派生类型解释为通过使具有 XmlText 特性的字符串数组字段成为对应类的成员而引入的混合内容。前面已指出,Xsd.exe 接受 <complexType mixed="true"> 来指示子代类型的继承混合内容,即使 <complexContent mixed="false> 应重写它也是如此。

通过限制派生类型

XML 架构允许限制具有混合内容的复杂类型,以派生具有非混合子元素的复杂类型。但是,.NET Framework 并不识别复杂类型限制,而是由 Xsd.exe 创建从基类继承的空类。请参见 <restriction> 元素。

可能的包含元素:<complexContent><complexType>

另请参见

参考

System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed