35.4. 从复杂类型派生复杂类型


概述

使用 XML Schema,您可以通过使用 complexContent 元素扩展或限制其他复杂类型来生成新的复杂类型。当生成 Java 类来代表派生的复杂类型时,Apache CXF 会扩展基本类型的类。这样,生成的 Java 代码会保留 XML 架构中所预期的继承层次结构。

模式语法

您可以使用 complexContent 元素以及 extension 元素或 limitations 元素从其他复杂类型获取复杂类型。complexContent 元素指定包含的数据描述包含多个字段。extension 元素和 limit 元素(即 complexContent 元素的子项)指定要修改的基本类型以创建新类型。基本类型由 base 属性指定。

扩展复杂类型

要扩展复杂类型,请使用 extension 元素来定义组成新类型的额外元素和属性。作为新类型定义的一部分,允许复杂类型描述中允许的所有元素。例如,您可以向新类型添加匿名枚举,或者您可以使用 choice 元素来指定每次只有一个新字段可以有效。

例 35.15 “根据扩展派生复杂类型” 显示一个 XML 架构片段,用于定义两个复杂的类型,即 widgetOrderInfowidgetOrderBillInfowidgetOrderBillInfo 通过扩展 widgetOrderInfo 来包括两个新元素: orderNumberamtDue

例 35.15. 根据扩展派生复杂类型

<complexType name="widgetOrderInfo">
  <sequence>
    <element name="amount" type="xsd:int"/>
    <element name="order_date" type="xsd:dateTime"/>
    <element name="type" type="xsd1:widgetSize"/>
    <element name="shippingAddress" type="xsd1:Address"/>
  </sequence>
  <attribute name="rush" type="xsd:boolean" use="optional" />
</complexType>
<complexType name="widgetOrderBillInfo">
  <complexContent>
    <extension base="xsd1:widgetOrderInfo">
      <sequence>
        <element name="amtDue" type="xsd:decimal"/>
        <element name="orderNumber" type="xsd:string"/>
      </sequence>
      <attribute name="paid" type="xsd:boolean"
                 default="false" />
    </extension>
  </complexContent>
</complexType>
Copy to Clipboard Toggle word wrap

限制复杂类型

要限制复杂类型,请使用 limit 元素来限制基本类型的元素或属性的可能值。在限制复杂类型时,您必须列出基本类型的所有元素和属性。对于每个元素,您可以在定义中添加限制的属性。例如,您可以在元素中添加 maxOccurs 属性来限制它可能发生的次数。您还可以使用 fixed 属性强制一个或多个元素具有预先确定的值。

例 35.16 “通过 Restriction 定义复杂类型” 演示了通过限制另一个复杂类型来定义复杂类型的示例。restricted 类型 wallawallaAddress 只能用于 Walla Walla, Washington 中的地址,因为 city 元素的值、state 元素和 zipCode 元素的值已被修复。

例 35.16. 通过 Restriction 定义复杂类型

<complexType name="Address">
  <sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:short" maxOccurs="3"/>
    <element name="city" type="xsd:string"/>
    <element name="state" type="xsd:string"/>
    <element name="zipCode" type="xsd:string"/>
  </sequence>
</complexType>
<complexType name="wallawallaAddress">
  <complexContent>
    <restriction base="xsd1:Address">
      <sequence>
        <element name="name" type="xsd:string"/>
        <element name="street" type="xsd:short"
                 maxOccurs="3"/>
        <element name="city" type="xsd:string"
                 fixed="WallaWalla"/>
        <element name="state" type="xsd:string"
                 fixed="WA" />
        <element name="zipCode" type="xsd:string"
                 fixed="99362" />
      </sequence>
    </restriction>
  </complexContent>
</complexType>
Copy to Clipboard Toggle word wrap

映射到 Java

与所有复杂类型一样,Apache CXF 会生成一个类来代表从另一个复杂类型派生的复杂类型。为派生复杂类型生成的 Java 类扩展为支持基本复杂类型生成的 Java 类。基本 Java 类也被修改为包含 @XmlSeeAlso 注释。基本类的 @XmlSeeAlso 注释列出了扩展基本类的所有类。

当新的复杂类型由扩展派生时,生成的类将包括所有添加的元素和属性的成员变量。新成员变量将根据与所有其他元素相同的映射生成。

当新的复杂类型由限制派生时,生成的类将没有新的成员变量。生成的类将只是不提供任何其他功能的 shell。完全允许您确保强制实施 XML 架构中定义的限制。

例如,例 35.15 “根据扩展派生复杂类型” 中的 schema 生成两个 Java 类: WidgetOrderInfoWidgetBillOrderInfoWidgetOrderBillInfo 扩展 WidgetOrderInfo,因为 widgetOrderBillInfo 派生自 widgetOrderInfo 的扩展。例 35.17 “WidgetOrderBillInfo” 显示为 widgetOrderBillInfo 生成的类。

例 35.17. WidgetOrderBillInfo

@XmlType(name = "widgetOrderBillInfo", propOrder = {
    "amtDue",
    "orderNumber"
})
public class WidgetOrderBillInfo
    extends WidgetOrderInfo
{
    @XmlElement(required = true)
    protected BigDecimal amtDue;
    @XmlElement(required = true)
    protected String orderNumber;
    @XmlAttribute
    protected Boolean paid;

    public BigDecimal getAmtDue() {
        return amtDue;
    }

    public void setAmtDue(BigDecimal value) {
        this.amtDue = value;
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String value) {
        this.orderNumber = value;
    }

    public boolean isPaid() {
        if (paid == null) {
            return false;
        } else {
            return paid;
        }
    }

    public void setPaid(Boolean value) {
        this.paid = value;
    }
}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat