XSD「仅含元素」(Only Elements / Element-Only Content)最清晰、最实用总结
—— 既没有属性,也没有文本,只有子元素(最常见、最标准的复合元素)
这类元素在企业级 XML、WebService、配置文件中占比 80% 以上,典型例子:
<person>
<name>张三</name>
<age>28</age>
<email>zs@example.com</email>
</person>
<order>
<orderId>O20251128001</orderId>
<customer>…</customer>
<items>…</items>
<total>999.99</total>
</order>
1. 标准写法(99% 项目都长这样)
<xs:element name="person">
<xs:complexType>
<xs:sequence> <!-- 顺序固定(最常用) -->
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:int"/>
<xs:element name="email" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这就是“仅含元素”的终极公式:<xs:complexType> + <xs:sequence>(或其他组合器) + 若干 <xs:element> + 完全没有 <xs:attribute>
2. 4 种最常见“仅含元素”变体(直接背)
| 场景 | XSD 关键代码 | XML 示例 |
|---|---|---|
| 顺序固定(最最最常用) | <xs:sequence> | 必须按 name → age → email 顺序 |
| 顺序随意(所有字段可选) | <xs:all>(每个子元素必须 minOccurs=”0 | 1″) |
| 任选其一 | <xs:choice> | 手机号或座机二选一 |
| 可重复(一对多子表) | maxOccurs="unbounded" | <order><item>…</item><item>…</item></order> |
3. 企业级真实模板(直接复制到项目里)
<!-- 用户(最经典的仅含元素)-->
<xs:complexType name="UserType">
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="gender" type="GenderType"/>
<xs:element name="birthday" type="xs:date" minOccurs="0"/>
<xs:element name="phones" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="phone" type="xs:string" maxOccurs="un unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- 订单(一对多经典结构)-->
<xs:complexType name="OrderType">
<xs:sequence>
<xs:element name="orderId" type="xs:string"/>
<xs:element name="customer" type="CustomerType"/>
<xs:element name="orderDate" type="xs:dateTime"/>
<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="totalAmount" type="xs:decimal"/>
<xs:element name="remark" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
4. 永远记住的 3 个铁律(写“仅含元素”永远不会错)
- 必须有
<xs:complexType> - 必须有
<xs:sequence>/<xs:all>/<xs:choice>中的一个 - 绝对不能出现
<xs:attribute>(哪怕一个也不行!)
只要违反上面任意一条,就不再是“仅含元素”了。
5. 常见错误 vs 正确写法
| 错误写法 | 正确写法(仅含元素) | 后果 |
|---|---|---|
加了 <xs:attribute> | 删掉所有 attribute | 变成“元素+属性” |
没包 <xs:sequence> 直接写 element | 必须包在 sequence/all/choice 里 | 验证直接报错 |
用了 <xs:simpleContent> 或 mixed | 只能用 complexContent + sequence | 变成可含文本 |
一句话总结:
“仅含元素” = complexType + sequence/all/choice + 纯子元素 + 零属性
大厂 90% 的业务对象都是这种最干净、最标准的结构!
需要我立刻给你生成任意业务的“仅含元素”结构(商品、地址、支付、发票、物流等),告诉我业务名,10 秒出成品!