在XML Schema(XSD)中,xs:element的default属性用于为简单类型的元素指定默认值。当XML实例文档里对应的元素内容为空,或者该元素以自闭合形式存在时,校验解析器会自动把default的值当作元素内容处理。这一机制常用于配置类XML,避免每个文件都重复写相同的基础参数。

一、default属性的基本用法
default只能用于具有简单类型(simpleType)或者内建简单类型的元素,不能用于包含子元素复杂类型的元素。下面给出一个最基础的XSD片段:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="timeout" type="xs:int" default="30"/>
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="retry" type="xs:int" default="3"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
在上述定义中,timeout元素若出现在XML中但内容为空,如<timeout/>,解析后其值被视为30。retry元素同理。
二、default与fixed的区别
很多初学者会混淆default和fixed。二者都写在xs:element上,但语义不同:
- default:提供默认值,XML实例中可以写其他值来覆盖它。
- fixed:固定值,XML实例中必须与此值完全一致,不能更改。
| 属性 | 是否可被覆盖 | 适用场景 |
|---|---|---|
| default | 是 | 通用配置缺省值 |
| fixed | 否 | 标准约束常量 |
三、使用限制与注意事项
1. 仅限简单类型
如果元素通过complexType包含子元素,则不能使用default。例如下面这种写法在XSD中是不合法的:
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- 错误:complexType元素不能用default -->
<xs:element default="guest"/>
</xs:element>
2. 空元素与缺失元素
default只对“存在但为空”的元素生效;如果XML中完全省略了该元素,且元素不是可选(minOccurs大于0),校验会报错而不是补默认值。因此常将元素设为可选:
<xs:element name="lang" type="xs:string" default="zh-CN" minOccurs="0"/>
3. 与nil的区别
若元素设置了xsi:nil="true",则表示空值,不会采用default。default只在元素文本为空字符串时触发。
四、完整示例
以下XSD定义了一个服务配置,其中端口和编码有默认值:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="service">
<xs:complexType>
<xs:sequence>
<xs:element name="port" type="xs:int" default="8080"/>
<xs:element name="encoding" type="xs:string" default="UTF-8"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对应XML实例可以写成:
<service> <port/> <encoding/> </service>
解析后port为8080,encoding为UTF-8。如果写成<port>9090</port>,则以9090为准。
五、总结
合理使用xs:element的default属性,可以让XSD在保持约束力的同时降低使用成本。记住它只作用于简单类型、可被覆盖、且只对空元素补值,就能在配置 schema 设计中少走弯路。
XML_Schemaxs:elementdefault修改时间:2026-07-29 04:42:24