XSD 实例

下面给你一份完整、可直接运行的 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 秒发你。

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部