xs:attribute的default属性仅在xml实例完全未声明该属性时生效,解析器直接填充默认值;若显式声明(含空字符串),则default失效,且必须严格匹配类型定义。

xs:attribute default 属性只在 XML 实例未提供该属性时生效
它不是运行时赋值,也不影响解析后的数据结构——XML 解析器读到这个属性就直接用默认值填充节点,但前提是实例里真没写这个属性。一旦写了哪怕是个空字符串 attr="",default 就彻底失效。
- 常见错误:以为设了
default="true",XML 里写成<elem attr=""></elem>还能当true用——实际是空字符串,类型可能都不匹配 - 使用场景:适合配置类 Schema,比如
<attribute name="version" type="xs:string" default="1.0"></attribute>,让老 XML 不填也能通过校验 - 注意
fixed和default的区别:fixed强制要求实例中必须等于指定值,default只补缺不校验
default 值必须严格匹配 attribute 的 type 定义
XML Schema 对类型检查很死,default 字符串必须能被目标类型合法解析,否则整个 Schema 加载失败(比如 Xerces 会报 SAXParseException)。
- 例如
type="xs:integer",default="42"合法,但default="42.0"或default=" 42 "(带空格)会报错 - 枚举类型
xs:restriction下,default必须是其中一个xs:enumeration value,拼错一个字符就无效 - 自定义简单类型若含
xs:pattern,default值也得过正则——常被忽略的坑
default 不会触发 xsi:nil 或 xsi:type 的隐式行为
很多人误以为加了 default 就能让元素“自动存在”,其实它只作用于属性本身,和元素内容、nil 处理、类型替换完全无关。
- 如果属性属于可选元素(
minOccurs="0"),即使设了default,该元素仍可完全不出现——default不提升出现性 -
xsi:nil="true"出现时,属性默认值不回退生效;同理,xsi:type切换后,新类型若没定义同名属性的default,该属性就真的缺失 - 工具链差异:JAXB 默认把
default映射为字段初始化值,但 .NET XmlSerializer 可能忽略它,依赖具体实现
验证时 default 值不可见,调试要靠解析器 API
你不会在原始 XML 文本里看到 default 补上的值,它只存在于验证/解析后的信息集中。想确认是否生效,得查解析器暴露的“schema normalized value”或“post-schema-validation infoset(PSVI)”。
- Java JAXB:用
Unmarshaller.setEventHandler()捕获ValidationEvent,或启用 PSVI 通过Node.getSchemaTypeInfo() - Python lxml:需开启
XMLSchema并调用schema.validate(),再用etree.tostring()看结果——但默认不注入 default 值,得手动处理 - 最稳的办法:写个最小 XML 实例(省略该属性),用命令行工具验证,比如
xmllint --schema schema.xsd instance.xml,看是否通过










