36.3. 使用 Unbound 属性


概述

XML Schema 具有一种机制,允许您在复杂的类型定义中保留任意属性的位置拥有者。使用这个机制,您可以定义可以具有任何属性的复杂类型。例如,您可以创建一个类型来定义元素 <robot name="epsilon" />、<robot age="10000" /> 或 <robot type="weevil" /> 而不指定三个属性。当数据需要灵活性时,这特别有用。

在 XML 架构中定义

Undeclared 属性在 XML Schema 中定义,使用 anyAttribute 元素。它可在什么地方使用 attribute 元素。anyAttribute 元素没有属性,如 例 36.7 “带有 Undeclared Attribute 的复杂类型” 所示。

例 36.7. 带有 Undeclared Attribute 的复杂类型

<complexType name="arbitter">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="rate" type="xsd:float" />
  </sequence>
  <anyAttribute />
</complexType>

定义的类型 arbitter 有两个元素,可以具有任何类型的一个属性。例 36.8 “使用 Wild Card 属性定义的元素示例” 中显示的元素可以从复杂类型 arbitter 生成。

例 36.8. 使用 Wild Card 属性定义的元素示例

<officer rank="12"><name>...</name><rate>...</rate></officer>
<lawyer type="divorce"><name>...</name><rate>...</rate></lawyer>
<judge><name>...</name><rate>...</rate></judge>

映射到 Java

当包含 anyAttribute 元素的复杂类型映射到 Java 时,代码生成器会将名为 otherAttributes 的成员添加到生成的类。otherAttributes 是类型为 java.util.Map<QName, String >,它具有返回映射实时实例的 getter 方法。由于从 getter 返回的映射是实时的,因此对映射的任何修改都会被自动应用。例 36.9 “class for a Complex Type with a Undeclared Attribute” 显示为 例 36.7 “带有 Undeclared Attribute 的复杂类型” 中定义的复杂类型生成的类。

例 36.9. class for a Complex Type with a Undeclared Attribute

public class Arbitter {

    @XmlElement(required = true)
    protected String name;
    protected float rate;

    @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }

    public float getRate() {
        return rate;
    }

    public void setRate(float value) {
        this.rate = value;
    }

    public Map<QName, String> getOtherAttributes() { return otherAttributes; }

}

使用未决定的属性

生成的类的 otherAttributes 成员预期使用 Map 对象填充。该映射使用 QNames 键。获取映射后,您可以访问对象上设置的任何属性,并在对象上设置新属性。

例 36.10 “使用 Undeclared 属性” 显示使用未拒绝属性的示例代码。

例 36.10. 使用 Undeclared 属性

Arbitter judge = new Arbitter();
Map<QName, String> otherAtts = judge.getOtherAttributes();

QName at1 = new QName("test.apache.org", "house");
QName at2 = new QName("test.apache.org", "veteran");

otherAtts.put(at1, "Cape");
otherAtts.put(at2, "false");

String vetStatus = otherAtts.get(at2);

例 36.10 “使用 Undeclared 属性” 中的代码执行以下操作:

获取包含未拒绝属性的映射。

创建 QNames 以使用属性。

将属性的值设置为映射中。

检索其中一个属性的值。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.