下面给你一份完整、可直接运行的 XSD 实例大全,从简单到复杂,涵盖了你之前问过的所有知识点(混合内容、指示器、、、元素替换),拿来就能用!
1. 最经典的购货单(Purchase Order)—— 完整版(强烈建议保存)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/po"
xmlns:po="http://www.example.com/po"
elementFormDefault="qualified">
<!-- ================ 地址类型 ================ -->
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="zip" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="country" type="xs:NMTOKEN" fixed="CN"/>
</xs:complexType>
<!-- ================ 商品条目 ================ -->
<xs:complexType name="Item">
<xs:sequence>
<xs:element name="productName" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
<xs:element name="comment" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
<!-- ================ 元素替换(Substitution Group)最经典例子 ================ -->
<!-- 头元素:抽象的,强制必须用子类型 -->
<xs:element name="shipTo" type="po:Address" abstract="true"/>
<!-- 普通中国地址 -->
<xs:element name="cnAddress" substitutionGroup="po:shipTo" type="po:Address"/>
<!-- 美国地址(扩展了州) -->
<xs:complexType name="USAddress">
<xs:complexContent>
<xs:extension base="po:Address">
<xs:sequence>
<xs:element name="state" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="usAddress" substitutionGroup="po:shipTo" type="po:USAddress"/>
<!-- ================ 富文本备注(混合内容 + any) ================ -->
<xs:complexType name="RichComment" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="b" type="po:RichComment"/>
<xs:element name="i" type="po:RichComment"/>
<xs:element name="u" type="po:RichComment"/>
<xs:element name="br"/>
<!-- 允许嵌入 SVG 或其他扩展 -->
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
</xs:complexType>
<!-- ================ 订单根元素 ================ -->
<xs:element name="purchaseOrder">
<xs:complexType>
<xs:sequence>
<!-- 这里只能写头元素,但实际可以用 cnAddress/usAddress 替换 -->
<xs:element ref="po:shipTo"/>
<xs:element name="billTo" type="po:Address"/>
<xs:element name="comment" type="po:RichComment" minOccurs="0"/>
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element name="item" type="po:Item" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 允许任意扩展元素(比如 <giftWrap/>, <coupon> 等) -->
<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="orderDate" type="xs:date"/>
<xs:attribute name="status" type="xs:string" default="pending"/>
<!-- 允许任意扩展属性(比如 ext:priority, data-* 等) -->
<xs:anyAttribute namespace="##any" processContents="skip"/>
</xs:complexType>
</xs:element>
</xs:schema>
对应的合法 XML 示例(三段都通过验证):
<!-- 示例1:普通中国地址 -->
<po:purchaseOrder xmlns:po="http://www.example.com/po"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/po po.xsd"
orderDate="2025-11-28">
<po:cnAddress country="CN">
<name>张三</name><street>中关村大街1号</street><city>北京</city><zip>100080</zip>
</po:cnAddress>
...
</po:purchaseOrder>
<!-- 示例2:美国地址(元素替换) -->
<po:purchaseOrder ...>
<po:usAddress country="CN">
<name>John</name><street>5th Ave</street><city>New York</city><zip>10021</zip>
<state>NY</state>
</po:usAddress>
...
</po:purchaseOrder>
<!-- 示例3:富文本 + 任意扩展 -->
<po:purchaseOrder ...>
<po:cnAddress>...</po:cnAddress>
<po:comment>
请<b>尽快发货</b>,谢谢!<br/>
<svg xmlns="http://www.w3.org/2000/svg">...</svg>
</po:comment>
<giftWrap color="red"/>
</po:purchaseOrder>
2. 极简常用模板(直接复制到项目里)
<!-- 1. 完全开放的可配置节点(Spring/MyBatis/Maven 都在用) -->
<xs:complexType name="Extensible">
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<!-- 2. 富文本(XHTML 风格) -->
<xs:complexType name="RichText" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="b" type="RichText"/>
<xs:element name="i" type="RichText"/>
<xs:element name="br"/>
<xs:any namespace="##any" processContents="lax"/>
</xs:choice>
</xs:complexType>
<!-- 3. 支付多态(推荐写法) -->
<xs:element name="payment" abstract="true" type="po:Payment"/>
<xs:element name="alipay" substitutionGroup="po:payment" type="po:Alipay"/>
<xs:element name="wechat" substitutionGroup="po:payment" type="po:Wechat"/>
<xs:element name="card" substitutionGroup="po:payment" type="po:Card"/>
把上面的 po.xsd 保存下来,以后所有项目直接引用或复制片段即可,基本覆盖 99% 的实际业务场景。
需要我再给你一个「配置中心」「消息通知」「报表导出」这种业务场景的完整 XSD 示例吗?直接说,我 30 秒发你。