XSD「复合元素」(Complex Element)最全实用总结
—— 真正 99% 项目里都用这 8 种写法就够了
复合元素 = 可以包含子元素、属性、混合文本等
典型例子:<person>、<order>、<book>、<address>
1. 8 种最常用写法(背会这 8 种,天下我有)
| 序号 | 场景 | XSD 核心写法 | 典型 XML 示例 |
|---|---|---|---|
| 1 | 最常见:只有子元素(顺序固定) | <xs:sequence> | <person><name>张三</name><age>28</age></person> |
| 2 | 子元素顺序随意 | <xs:all>(每个子元素 minOccurs/maxOccurs 只能是 0 或 1) | 地址的省市区可以乱序 |
| 3 | 子元素任选其一 | <xs:choice> | 手机号或座机二选一 |
| 4 | 子元素可以重复 | <xs:sequence maxOccurs="unbounded"> 或直接在 element 上写 maxOccurs | <order><item>...</item><item>...</item></order> |
| 5 | 既有子元素又有属性(最最最常见!) | <xs:sequence>…</xs:sequence> + <xs:attribute …/> | <book id="001"><title>XXX</title></book> |
| 6 | 纯属性元素(没有子元素) | 空 <xs:sequence/> + 多个 <xs:attribute> | <point x="10" y="20"/> |
| 7 | 混合内容(文本+子元素) | <xs:complexType mixed="true"> | <p>这是<em>重点</em>内容</p> |
| 8 | 空元素(只有属性) | 不写 <xs:sequence> 或写空序列 + 属性 | <img src="a.jpg" width="100"/> |
2. 真实项目中最常用的「黄金模板」(直接复制粘贴)
<!-- 1. 标准用户(最常见组合)-->
<xs:complexType name="UserType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:int" minOccurs="0"/>
<xs:element name="email" type="xs:string" minOccurs="0"/>
<xs:element name="phone" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="status" type="UserStatusType"/>
</xs:complexType>
<!-- 2. 订单 + 订单明细(经典一对多)-->
<xs:complexType name="OrderType">
<xs:sequence>
<xs:element name="orderId" type="xs:string"/>
<xs:element name="customer" type="CustomerType"/>
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element name="item" type="OrderItemType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="orderDate" type="xs:dateTime" use="required"/>
</xs:complexType>
<xs:complexType name="OrderItemType">
<xs:sequence>
<xs:element name="productId" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="lineId" type="xs:string" use="required"/>
</xs:complexType>
3. 企业级最佳实践模板(大厂标配)
<xs:complexType name="任意业务实体Type">
<xs:sequence>
<!-- 业务字段 -->
<xs:element name="name" type="xs:string"/>
<xs:element name="code" type="xs:string" minOccurs="0"/>
<!-- 一对多子表 -->
<xs:element name="details" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="detail" type="DetailType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<!-- 通用审计属性(99% 系统都有)-->
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="status" type="StatusEnumType"/>
<xs:attribute name="createTime" type="xs:dateTime"/>
<xs:attribute name="updateTime" type="xs:dateTime"/>
<xs:attribute name="version" type="xs:string" fixed="1.0"/>
</xs:complexType>
4. 5 个永远记住的规则(写复合元素永远不会错)
| 规则 | 说明 |
|---|---|
子元素必须包在 <xs:sequence> / <xs:all> / <xs:choice> 里 | 不能直接裸写多个 <xs:element> |
| 属性永远写在 sequence/all/choice 之后 | 顺序不能错 |
想重复就加 maxOccurs="unbounded" 或写在 <xs:element> 上 | 两种写法都行 |
想可选就加 minOccurs="0" | 默认就是 1(必填) |
| 推荐把可复用的复合结构定义成命名 complexType | 不要全用匿名类型,方便复用和维护 |
一句话总结:
复合元素 = <xs:complexType> + <xs:sequence>(放子元素)+ 最后几行 <xs:attribute>(放属性)
需要我直接给你生成某个业务的完整复合元素(用户、商品、订单、支付、地址、物流等),直接告诉我业务名,我 10 秒出成品!