本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.
.NET Framework 为 default 特性提供部分绑定支持。
Xsd.exe 工具将默认元素或特性值等同于应用于已生成的字段的 System.ComponentModel.DefaultValueAttribute;该字段还以静态方式初始化为默认值。
说明
default 特性可以出现在 <element> 或 <attribute> 声明中,用于提供默认值。如果在收到实例文档时该元素为空或者该特性不存在,则将使用默认值。
对于特性而言,只有当特性是可选的时(attribute 元素绑定支持 中描述的 use 特性具有默认值 optional
),默认值才有意义。指定特性时,必须为该特性指定值。
对于元素而言,只有当元素出现在实例文档中但没有任何内容时,才使用默认值。如果该元素根本不出现,则不会填充它。
当从 XML 架构文档生成源代码时,Xsd.exe 会接受与具有默认值的元素或特性相对应的每个字段,应用 System.ComponentModel.DefaultValueAttribute 并将默认值作为参数传递。此外,Xsd.exe 还以静态方式将该字段初始化为默认值,如下面的示例所示:
[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;
对于数组(maxOccurs 大于 1
的元素),默认特性将被忽略。
数据类型支持的绑定
根据 XML 架构,default 特性值必须为简单类型。对于几乎所有的简单类型来说,Xsd.exe 在执行从 XML 架构到类以及从类到新的 XML 架构文档的往返转换中都保留默认值。
xsd:base64Binary 或 xsd:hexBinary 类型的元素或特性例外。DefaultValue 特性不会应用于创建的对应 System.Byte 字段。
另一个例外是列表类型的特性。<list> 构造用于定义一个简单类型,该简单类型的可能值是用空白分隔的一系列值,这些值来自另一个简单类型。(Xsd.exe 不会为列表类型的元素生成源代码。)对于列表,Xsd.exe 创建一个构成类型的数组,但将默认值转换为构成类型的实例,而不是转换为构成类型的数组。
请考虑下面的输入 <attribute> 声明:
<xsd:attribute name="siblings" default="unknown">
<xsd:simpleType>
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
</xsd:attribute>
对于此声明,将生成下面的源代码:
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";
由于 String 对象不能隐式强制转换为 String 对象的数组,因此上面的源代码编译失败。任何简单类型的列表都会出现以上错误,包括枚举类型。
对元素绑定值类型的 minOccurs 特性的影响
假设某个类成员具有一个 .NET Framework 值类型且映射到一个 XML 元素(通过默认的 XmlElementAttribute)。如果 Xsd.exe 在基于类生成 XSD 文档时遇到应用于此类成员的 DefaultValue 特性,它将为 <element> 元素的 minOccurs 特性生成值 0
。这表示该元素不必出现在有效的 XML 实例文档中。
与特性的 use="optional" 组合
假设 <attribute> 声明包含值为 optional
(还是默认值)的 use 特性。当从 XSD 文档生成源代码时,Xsd.exe 将结合是否指定了 default 特性解释此值。有如下两种可能的解释:
已指定 default:Xsd.exe 生成具有 XmlAttributeAttribute 以及 DefaultValueAttribute(指定默认值)的公共字段。
未指定 default:Xsd.exe 生成一个具有 XmlAttributeAttribute 的公共字段。另外,对于值类型,它还生成一个 bool 类型的公共字段,其名称为追加了
Specified
的特性字段名称。例如,如果特性字段的名称为startDate
,则 bool 字段的名称将为startDateSpecified
。将某个对象序列化为 XML 时,XmlSerializer 类将检查 bool 字段的值,以确定是否写入可选的特性。出现的 bool 字段将具有 System.Xml.Serialization.XmlIgnoreAttribute,以防止它被 XmlSerializer 序列化。
示例
输入 XML 架构文档:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
<xsd:element name="FamilyDog" type="FamilyDogType"/>
<xsd:complexType name="FamilyDogType">
<xsd:sequence>
<xsd:element name="name" type="xsd:stringo" default="Spot"/>
<xsd:element name="birthdate" type="xsd:date" default="2002-03-04"/>
</xsd:sequence>
<xsd:attribute name="gender" type="GenderType" default="UNKNOWN"/>
<xsd:attribute name="fixed" type="xsd:boolean" default="false"/>
<xsd:attribute name="breed" type="xsd:string" default="Swedish Vallhund"/>
</xsd:complexType>
<xsd:simpleType name="GenderType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FEMALE" />
<xsd:enumeration value="MALE" />
<xsd:enumeration value="UNKNOWN" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
基于前面的 XML 架构文档生成的 C# 类:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyDog", Namespace="http://example.org/", IsNullable=false)]
public class FamilyDogType {
[System.ComponentModel.DefaultValueAttribute("Spot")]
public string name = "Spot";
[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
public System.DateTime birthdate = new System.DateTime(631507968000000000);
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(GenderType.UNKNOWN)]
public GenderType gender = GenderType.UNKNOWN;
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(false)]
public bool @fixed = false;
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("Swedish Vallhund")]
public string breed = "Swedish Vallhund";
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum GenderType {
FEMALE,
MALE,
UNKNOWN,
}
基于通过前面的 C# 源代码编译得到的程序集所生成的 XML 架构文档实际上与生成 C# 源代码的原始 XML 架构相同。
可能的包含元素:<attribute>、<element>
另请参见
参考
System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue