XSD 中「属性」(attribute)最全、最实用的总结
—— 90% 项目只用下面这几招就够了
1. 属性 vs 元素 快速对比(先搞清楚什么时候用属性)
| 场景 | 推荐用「属性」 | 推荐用「元素」 |
|---|---|---|
| 简单、元数据、标识符 | Yes(id、code、status、type、version) | No |
| 内容本身是主要数据 | No | Yes(name、price、description) |
| 需要排序、子结构 | No | Yes |
| 可能为空或有多个值 | No | Yes(多电话、多邮箱) |
| 企业规范 / Web Service | 绝大多数属性都写成 attribute | 业务数据几乎都用 element |
2. 最常用的 6 种属性写法(背会这 6 种就无敌)
| 写法 | XSD 示例 | 对应合法 XML | 说明 |
|---|---|---|---|
| 1. 必填属性(最常见) | <xs:attribute name="id" type="xs:string" use="required"/> | <book id="B001"> | 不写就验证失败 |
| 2. 可选属性 | <xs:attribute name="status" type="xs:string" use="optional"/> | 可有可无 | 默认就是 optional,可省略 |
| 3. 带默认值 | <xs:attribute name="currency" type="xs:string" default="CNY"/> | 不写自动补 CNY | 常用于货币、语言 |
| 4. 固定值(只能是这个值) | <xs:attribute name="version" type="xs:string" fixed="2.0"/> | 只能写 version=”2.0″ | 常用于协议版本 |
| 5. 禁止使用该属性 | <xs:attribute name="deprecated" type="xs:string" use="prohibited"/> | 完全不允许出现 | 版本升级时封掉老属性 |
| 6. 自定义枚举属性 | 见下面第 4 节 | <order type="NORMAL"/> | 状态、类型最常用 |
3. 完整语法(永远只需要记住这一行)
<xs:attribute name="属性名"
type="xs:string 或 自定义简单类型"
use="required | optional | prohibited" <!-- 可省略,默认为 optional -->
default="默认值" <!-- use不能是required时才生效 -->
fixed="固定值" /> <!-- 与default互斥 -->
4. 真实项目中最常用的一组属性模板(直接复制)
<!-- 在 complexType 里这样写 -->
<xs:complexType name="BookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<!-- 下面是属性区 -->
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="isbn" type="xs:string" use="required"/>
<xs:attribute name="lang" type="xs:string" default="zh-CN"/>
<xs:attribute name="currency" type="xs:string" fixed="CNY"/>
<xs:attribute name="status" type="BookStatusType"/> <!-- 自定义枚举 -->
<xs:attribute name="version" type="xs:string" fixed="1.0"/>
</xs:complexType>
<!-- 自定义枚举类型(强烈推荐这样写属性) -->
<xs:simpleType name="BookStatusType">
<xs:restriction base="xs:string">
<xs:enumeration value="NORMAL"/>
<xs:enumeration value="OFF_SHELF"/>
<xs:enumeration value="DELETED"/>
</xs:restriction>
</xs:simpleType>
5. 企业级最佳实践(大厂都这么写)
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="code" type="xs:string" use="required"/>
<xs:attribute name="type" type="xxxEnumType"/>
<xs:attribute name="status" type="xxxStatusType"/>
<xs:attribute name="version" type="xs:string" fixed="1.0"/>
<xs:attribute name="lang" type="xs:language" default="zh-CN"/>
<xs:attribute name="createTime" type="xs:dateTime" use="optional"/>
6. 常见错误(99% 新手会踩的坑)
| 错误写法 | 正确写法 | 后果 |
|---|---|---|
把属性写在 <xs:sequence> 里 | 必须写在 sequence 后面 | 验证直接报错 |
| use=”required” 同时又写 default | default 只能和 optional 一起用 | 工具报错或行为异常 |
| 属性用了 complexType | 属性永远只能是 simpleType | 语法错误 |
| 忘记在 complexType 里声明属性 | 必须在 complexType 内部声明 | XML 中写属性也验证不通过 |
一句话总结:
属性永远简单、必填、枚举、带默认/固定值,写在 complexType 的最后面,use=required 是最常见用法。
需要我直接给你生成某个实体(用户、订单、商品、支付)的完整属性区,直接说业务名就行!